本文爲學習筆記,主要用於記錄本人學習過程。內容爲轉載!!!!
ActiveMQ介紹
MQ是消息中間件,是一種在分佈式系統中應用程序藉以傳遞消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的開源項目,完全支持JMS1.1和J2EE1.4規範的JMS Provider實現。
特點:
1、支持多種語言編寫客戶端
2、對spring的支持,很容易和spring整合
3、支持多種傳輸協議:TCP,SSL,NIO,UDP等
4、支持AJAX
消息形式:
1、點對點(queue)
2、一對多(topic)
ActiveMQ安裝
我這裏提供一個安裝好的虛擬機:http://download.csdn.net/download/liuyuanq123/10217892
服務器運行後,我們可以直接訪問到activeMQ的界面:
然後點擊queues可以看到現在沒有一條消息:
ActiveMQ測試
編寫一個測試類對ActiveMQ進行測試,首先得向pom文件中添加ActiveMQ相關的jar包:
<span style="color:#000000"><code> <span style="color:#006666"><<span style="color:#4f4f4f">dependency</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.apache.activemq<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>activemq-all<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">dependency</span>></span> </code></span>
- queue的發送代碼如下:
<span style="color:#000000"><code> <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">testMQProducerQueue</span>() <span style="color:#000088">throws</span> Exception{
<span style="color:#880000">//1、創建工廠連接對象,需要制定ip和端口號</span>
ConnectionFactory connectionFactory = <span style="color:#000088">new</span> ActiveMQConnectionFactory(<span style="color:#009900">"tcp://192.168.156.44:61616"</span>);
<span style="color:#880000">//2、使用連接工廠創建一個連接對象</span>
Connection connection = connectionFactory.createConnection();
<span style="color:#880000">//3、開啓連接</span>
connection.start();
<span style="color:#880000">//4、使用連接對象創建會話(session)對象</span>
Session session = connection.createSession(<span style="color:#000088">false</span>, Session.AUTO_ACKNOWLEDGE);
<span style="color:#880000">//5、使用會話對象創建目標對象,包含queue和topic(一對一和一對多)</span>
Queue queue = session.createQueue(<span style="color:#009900">"test-queue"</span>);
<span style="color:#880000">//6、使用會話對象創建生產者對象</span>
MessageProducer producer = session.createProducer(queue);
<span style="color:#880000">//7、使用會話對象創建一個消息對象</span>
TextMessage textMessage = session.createTextMessage(<span style="color:#009900">"hello!test-queue"</span>);
<span style="color:#880000">//8、發送消息</span>
producer.send(textMessage);
<span style="color:#880000">//9、關閉資源</span>
producer.close();
session.close();
connection.close();
}</code></span>
接收代碼:
<span style="color:#000000"><code> <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">TestMQConsumerQueue</span>() <span style="color:#000088">throws</span> Exception{
<span style="color:#880000">//1、創建工廠連接對象,需要制定ip和端口號</span>
ConnectionFactory connectionFactory = <span style="color:#000088">new</span> ActiveMQConnectionFactory(<span style="color:#009900">"tcp://192.168.156.44:61616"</span>);
<span style="color:#880000">//2、使用連接工廠創建一個連接對象</span>
Connection connection = connectionFactory.createConnection();
<span style="color:#880000">//3、開啓連接</span>
connection.start();
<span style="color:#880000">//4、使用連接對象創建會話(session)對象</span>
Session session = connection.createSession(<span style="color:#000088">false</span>, Session.AUTO_ACKNOWLEDGE);
<span style="color:#880000">//5、使用會話對象創建目標對象,包含queue和topic(一對一和一對多)</span>
Queue queue = session.createQueue(<span style="color:#009900">"test-queue"</span>);
<span style="color:#880000">//6、使用會話對象創建生產者對象</span>
MessageConsumer consumer = session.createConsumer(queue);
<span style="color:#880000">//7、向consumer對象中設置一個messageListener對象,用來接收消息</span>
consumer.setMessageListener(<span style="color:#000088">new</span> MessageListener() {
<span style="color:#9b859d">@Override</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">onMessage</span>(Message message) {
<span style="color:#880000">// TODO Auto-generated method stub</span>
<span style="color:#000088">if</span>(message <span style="color:#000088">instanceof</span> TextMessage){
TextMessage textMessage = (TextMessage)message;
<span style="color:#000088">try</span> {
System.out.println(textMessage.getText());
} <span style="color:#000088">catch</span> (JMSException e) {
<span style="color:#880000">// TODO Auto-generated catch block</span>
e.printStackTrace();
}
}
}
});
<span style="color:#880000">//8、程序等待接收用戶消息</span>
System.in.read();
<span style="color:#880000">//9、關閉資源</span>
consumer.close();
session.close();
connection.close();
}</code></span>
- 然後當我們運行queue發送的時候可以看到隊列裏已經有一條消息了,但沒有發送出去:
然後在運行queue 的接收端,可以看到消息已經發出了:
接着對topic進行測試,發送代碼如下:
<span style="color:#000000"><code> <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">TestTopicProducer</span>() <span style="color:#000088">throws</span> Exception{
<span style="color:#880000">//1、創建工廠連接對象,需要制定ip和端口號</span>
ConnectionFactory connectionFactory = <span style="color:#000088">new</span> ActiveMQConnectionFactory(<span style="color:#009900">"tcp://192.168.156.44:61616"</span>);
<span style="color:#880000">//2、使用連接工廠創建一個連接對象</span>
Connection connection = connectionFactory.createConnection();
<span style="color:#880000">//3、開啓連接</span>
connection.start();
<span style="color:#880000">//4、使用連接對象創建會話(session)對象</span>
Session session = connection.createSession(<span style="color:#000088">false</span>, Session.AUTO_ACKNOWLEDGE);
<span style="color:#880000">//5、使用會話對象創建目標對象,包含queue和topic(一對一和一對多)</span>
Topic topic = session.createTopic(<span style="color:#009900">"test-topic"</span>);
<span style="color:#880000">//6、使用會話對象創建生產者對象</span>
MessageProducer producer = session.createProducer(topic);
<span style="color:#880000">//7、使用會話對象創建一個消息對象</span>
TextMessage textMessage = session.createTextMessage(<span style="color:#009900">"hello!test-topic"</span>);
<span style="color:#880000">//8、發送消息</span>
producer.send(textMessage);
<span style="color:#880000">//9、關閉資源</span>
producer.close();
session.close();
connection.close();
}</code></span>
- 接收代碼:
<span style="color:#000000"><code> <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">TestTopicConsumer</span>() <span style="color:#000088">throws</span> Exception{
<span style="color:#880000">//1、創建工廠連接對象,需要制定ip和端口號</span>
ConnectionFactory connectionFactory = <span style="color:#000088">new</span> ActiveMQConnectionFactory(<span style="color:#009900">"tcp://192.168.156.44:61616"</span>);
<span style="color:#880000">//2、使用連接工廠創建一個連接對象</span>
Connection connection = connectionFactory.createConnection();
<span style="color:#880000">//3、開啓連接</span>
connection.start();
<span style="color:#880000">//4、使用連接對象創建會話(session)對象</span>
Session session = connection.createSession(<span style="color:#000088">false</span>, Session.AUTO_ACKNOWLEDGE);
<span style="color:#880000">//5、使用會話對象創建目標對象,包含queue和topic(一對一和一對多)</span>
Topic topic = session.createTopic(<span style="color:#009900">"test-topic"</span>);
<span style="color:#880000">//6、使用會話對象創建生產者對象</span>
MessageConsumer consumer = session.createConsumer(topic);
<span style="color:#880000">//7、向consumer對象中設置一個messageListener對象,用來接收消息</span>
consumer.setMessageListener(<span style="color:#000088">new</span> MessageListener() {
<span style="color:#9b859d">@Override</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">onMessage</span>(Message message) {
<span style="color:#880000">// TODO Auto-generated method stub</span>
<span style="color:#000088">if</span>(message <span style="color:#000088">instanceof</span> TextMessage){
TextMessage textMessage = (TextMessage)message;
<span style="color:#000088">try</span> {
System.out.println(textMessage.getText());
} <span style="color:#000088">catch</span> (JMSException e) {
<span style="color:#880000">// TODO Auto-generated catch block</span>
e.printStackTrace();
}
}
}
});
<span style="color:#880000">//8、程序等待接收用戶消息</span>
System.in.read();
<span style="color:#880000">//9、關閉資源</span>
consumer.close();
session.close();
connection.close();
}</code></span>
- 然後運行topic發送:
可以看到消息已經發送出去。再運行topic接收:
可以看到有了一個消費者,但是沒有接收的消息,這是因爲正常情況下我們的topic消息不會再服務器持久化,所以要先打開消費者,再打開生產者,這個時候我們再運行生產者發送一條消息看到消息已經接收到了:
ActiveMQ整合spring及項目中運用
activeMQ與spring看一整合到一起使用,除了添加ActiveMQ相關的jar包外,還需要添加spring的jar包:
<span style="color:#000000"><code> <span style="color:#006666"><<span style="color:#4f4f4f">dependency</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.springframework<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>spring-context<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">dependency</span>></span> </code></span>
- 然後編寫applicationContext-activemq.xml文件,
代碼如下:
<span style="color:#000000"><code><span style="color:#006666"><?xml version="1.0" encoding="UTF-8"?></span>
<span style="color:#006666"><<span style="color:#4f4f4f">beans</span> <span style="color:#4f4f4f">xmlns</span>=<span style="color:#009900">"http://www.springframework.org/schema/beans"</span>
<span style="color:#4f4f4f">xmlns:context</span>=<span style="color:#009900">"http://www.springframework.org/schema/context"</span> <span style="color:#4f4f4f">xmlns:p</span>=<span style="color:#009900">"http://www.springframework.org/schema/p"</span>
<span style="color:#4f4f4f">xmlns:aop</span>=<span style="color:#009900">"http://www.springframework.org/schema/aop"</span> <span style="color:#4f4f4f">xmlns:tx</span>=<span style="color:#009900">"http://www.springframework.org/schema/tx"</span>
<span style="color:#4f4f4f">xmlns:dubbo</span>=<span style="color:#009900">"http://code.alibabatech.com/schema/dubbo"</span>
<span style="color:#4f4f4f">xmlns:xsi</span>=<span style="color:#009900">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span style="color:#4f4f4f">xsi:schemaLocation</span>=<span style="color:#009900">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"</span>></span>
<span style="color:#880000"><!-- 配置能夠產生connection的connectionfactory,由JMS對應的服務廠商提供 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"tagertConnectionFactory"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.ActiveMQConnectionFactory"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"brokerURL"</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"tcp://192.168.156.44:61616"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置spring管理真正connectionfactory的connectionfactory,相當於spring對connectionfactory的一層封裝 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"connectionFactory"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.springframework.jms.connection.SingleConnectionFactory"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"targetConnectionFactory"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"tagertConnectionFactory"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置生產者 --></span>
<span style="color:#880000"><!-- Spring使用JMS工具類,可以用來發送和接收消息 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"jmsTemplate"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.springframework.jms.core.JmsTemplate"</span>></span>
<span style="color:#880000"><!-- 這裏是配置的spring用來管理connectionfactory的connectionfactory --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"connectionFactory"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"connectionFactory"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置destination --></span>
<span style="color:#880000"><!-- 隊列目的地 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"queueDestination"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.command.ActiveMQQueue"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"spring-queue"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 話題目的地 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"itemAddTopic"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.command.ActiveMQTopic"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"item-add-topic"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">beans</span>></span> </code></span>
- 然後在我們淘淘商城中,商品添加到數據庫的時候,對應也要添加數據到我們的solr索引中,所以生產者應該在插入數據後創建:
當然,在xml文件中配置好的jmstemplate和destination也要注入進來:
<span style="color:#000000"><code> <span style="color:#9b859d">@Autowired</span>
<span style="color:#000088">private</span> JmsTemplate jmsTemplate;
<span style="color:#9b859d">@Resource</span>(name=<span style="color:#009900">"itemAddTopic"</span>)
<span style="color:#000088">private</span> Destination destination;</code></span>
然後消費者應該寫在我們的搜索工程中,首先添加spring和activeMQ的jar包,然後配置xml文件,再編寫一個監聽器,當接收到消息時,就講數據存入索引庫,xml文件代碼如下:
<span style="color:#000000"><code><span style="color:#006666"><?xml version="1.0" encoding="UTF-8"?></span>
<span style="color:#006666"><<span style="color:#4f4f4f">beans</span> <span style="color:#4f4f4f">xmlns</span>=<span style="color:#009900">"http://www.springframework.org/schema/beans"</span>
<span style="color:#4f4f4f">xmlns:context</span>=<span style="color:#009900">"http://www.springframework.org/schema/context"</span> <span style="color:#4f4f4f">xmlns:p</span>=<span style="color:#009900">"http://www.springframework.org/schema/p"</span>
<span style="color:#4f4f4f">xmlns:aop</span>=<span style="color:#009900">"http://www.springframework.org/schema/aop"</span> <span style="color:#4f4f4f">xmlns:tx</span>=<span style="color:#009900">"http://www.springframework.org/schema/tx"</span>
<span style="color:#4f4f4f">xmlns:dubbo</span>=<span style="color:#009900">"http://code.alibabatech.com/schema/dubbo"</span>
<span style="color:#4f4f4f">xmlns:xsi</span>=<span style="color:#009900">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span style="color:#4f4f4f">xsi:schemaLocation</span>=<span style="color:#009900">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"</span>></span>
<span style="color:#880000"><!-- 配置能夠產生connection的connectionfactory,由JMS對應的服務廠商提供 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"tagertConnectionFactory"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.ActiveMQConnectionFactory"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"brokerURL"</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"tcp://192.168.156.44:61616"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置spring管理真正connectionfactory的connectionfactory,相當於spring對connectionfactory的一層封裝 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"connectionFactory"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.springframework.jms.connection.SingleConnectionFactory"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"targetConnectionFactory"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"tagertConnectionFactory"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置destination --></span>
<span style="color:#880000"><!-- 隊列目的地 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"queueDestination"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.command.ActiveMQQueue"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"spring-queue"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 話題目的地 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"itemAddTopic"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.apache.activemq.command.ActiveMQTopic"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">constructor-arg</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"item-add-topic"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#880000"><!-- 配置監聽器 --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"myListener"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"com.taotao.search.listener.MyListener"</span>/></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"itemAddListener"</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"com.taotao.search.listener.ItemAddListener"</span>/></span>
<span style="color:#880000"><!-- 系統監聽器 --></span>
<span style="color:#880000"><!-- <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="queueDestination"/>
<property name="messageListener" ref="myListener"/>
</bean> --></span>
<span style="color:#006666"><<span style="color:#4f4f4f">bean</span> <span style="color:#4f4f4f">class</span>=<span style="color:#009900">"org.springframework.jms.listener.DefaultMessageListenerContainer"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"connectionFactory"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"connectionFactory"</span>/></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"destination"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"itemAddTopic"</span>/></span>
<span style="color:#006666"><<span style="color:#4f4f4f">property</span> <span style="color:#4f4f4f">name</span>=<span style="color:#009900">"messageListener"</span> <span style="color:#4f4f4f">ref</span>=<span style="color:#009900">"itemAddListener"</span>/></span>
<span style="color:#006666"></<span style="color:#4f4f4f">bean</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">beans</span>></span> </code></span>
- 接收消息代碼:
最後同時打開測試即可。
轉載自:https://blog.csdn.net/liuyuanq123/article/details/79109218