关于ActiveMQ的一点总结
生活随笔
收集整理的這篇文章主要介紹了
关于ActiveMQ的一点总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ActiveMQ入門
作者:一路向北摘要:本文主要講述ActiveMQ的基本知識和使用方法,并簡單結合spring使用ActiveMQ。
一、ActiveMQ特性和使用總覽企業消息軟件從80年代起就存在,它不只是一種應用間消息傳遞風格,也是一種集成風格。因此,消息傳遞可以滿足應用間的通知和互相操作。但是開源的解決方案是到最近10年才出現的。Apache ActiveMQ就是其中一種。它使應用間能以異步,松耦合方式交流。本章將向您介紹ActiveMQ。ActiveMQ是Apache軟件基金下的一個開源軟件,它遵循JMS1.1規范(Java Message Service),是消息驅動中間件軟件(MOM)。它為企業消息傳遞提供高可用,出色性能,可擴展,穩定和安全保障。ActiveMQ使用Apache許可協議。因此,任何人都可以使用和修改它而不必反饋任何改變。這對于商業上將ActiveMQ用在重要用途的人尤為關鍵。MOM的工作是在分布式的各應用之間調度事件和消息,使之到達指定的接收者。所以高可用,高性能,高可擴展性尤為關鍵。ActiveMQ的目標是在盡可能多的平臺和語言上提供一個標準的,消息驅動的應用集成。ActiveMQ實現JMS規范并在此之上提供大量額外的特性。下面是一個高層次的特性列表。·遵循JMS規范 ----理解ActiveMQ的起始點是明白ActiveMQ的各種特性是JMS1.1規范的實現。本章后面將討論JMS規范提供的好處和保證。它們包括同步和異步消息傳遞,一次和只有一次的消息傳遞,對于預訂者的持久消息等等。依附于JMS規范意味著,不論JMS消息提供者是誰,同樣的基本特性都是有效的。·連接----ActiveMQ提供各種連接選擇,包括HTTP,HTTPS,IP多點傳送,SSL,STOMP,TCP,UDP,XMPP等。大量的連接協議支持使之具有更好的靈活性。很多現有的系統使用一種特定協議并且不能改變,所以一個支持多種協議的消息平臺降低了使用的門檻。雖然連接很重要,但是和其他容器集成也同樣重要。第四章將講解ActiveMQ的傳輸連接器(transport connectors)和網絡連接器(network connectors)。·可插拔的持久性和安全----ActiveMQ提供多種持久性方案可供選擇,也可以完全按自己需求定制驗證和授權。例如,ActiveMQ通過KahaDB提供自己的超快速消息持久方案(ultra-fast message persistence),但也支持標準的JDBC方案。ActiveMQ可以通過配置文件提供簡單的驗證和授權,也提供標準的JAAS登陸模塊。·用Java建立消息驅動應用----ActiveMQ最常用在Java應用中,用于發送和接收消息。這部分的內容涉及JMS規范API。·與應用服務器集成----ActiveMQ與java應用服務器集成是很常見的。·客戶端APIs----ActiveMQ對多種語言提供客戶端API,除了Java之外還有C/C++,.NET,Perl,PHP,Python,Ruby等。這使得ActiveMQ能用在Java之外的其它語言中。很多其它語言都可以通過ActiveMQ提供的客戶端API使用ActiveMQ的全部特性。當然,ActiveMQ代理器(broker)仍然是運行在java虛擬機上,但是客戶端能夠使用其它的被支持的語言。·代理器集群(Broker clustering)----為了利于擴展,多個ActiveMQ broker能夠聯合工作。這個方式就是network of brokers并且能支持多種拓撲結構。·高級代理器特性和客戶端選項----ActiveMQ為代理器和客戶端連接提供很多高級的特性。ActiveMQ也可以通過代理器的XML配置文件支持Apache Camel。·簡單的管理----ActiveMQ是為開發者設計的。它并不需要專門的管理工具,因為它提供各種易用且強大的管理特性。有很多方法去監控ActiveMQ的各個方面,可以通過JMX使用JConsole或ActiveMQ web console;可以運行ActiveMQ消息報告;可以用命令行腳本;可以通過日志。用 ActiveMQ 最好還是了解下 JMSJMS 公共 點對點域 發布/訂閱域ConnectionFactory QueueConnectionFactory TopicConnectionFactoryConnection QueueConnection TopicConnectionDestination Queue TopicSession QueueSession TopicSessionMessageProducer QueueSender TopicPublisherMessageConsumer QueueReceiver TopicSubscriberJMS 定義了兩種方式:Quere(點對點);Topic(發布/訂閱)。·ConnectionFactory 是連接工廠,負責創建Connection。·Connection 負責創建 Session。·Session 創建 MessageProducer(用來發消息) 和 MessageConsumer(用來接收消息)。·Destination 是消息的目的地。詳細的可以網上找些 JMS 規范(有中文版)
二、開始使用ActiveMQ開始使用ActiveMQ并不難。你只要啟動代理器并確保它能接受連接和發送消息。ActiveMQ有一些自帶的例子。在這部分,你將下載和安裝Java SE,下載和安裝ActiveMQ,檢查ActiveMQ目錄,然后第一次啟動ActiveMQ。所需工具包括JDK1.5+、Ant、ActiveMQ。
1、JDK下載和安裝ActiveMQ 要求Sun Java SE 1.5或以上。在開始這部分前,必須先安裝。JDK的下載和安裝就不是本文介紹重點。
2、Ant下載和安裝Ant可以用來構建和運行ActiveMQ自帶例子。Ant可以從Apache Ant網址下載。URL: http://ant.apache.org/bindownload.cgi點擊鏈接地址并選擇正確的壓縮包。(tar包是Linux和Unix,zip是Windows)。請按照下列地址安裝Ant。URL: http://ant.apache.org/manual/install.html。確保你設置好$ANT_HOME環境變量,并將$ANT_HOME/bin放到$PATH環境變量里。安裝完畢后你可以運行下面的命令查看Ant版本。你的可能跟我的不太一樣,使用Ant的不同版本,不過這沒關系。一旦Ant輸出如上信息,你就可以確定Ant都安裝正確。
3、ActiveMQ下載和安裝ActiveMQ可以從Apache ActiveMQ網站下,URL: http://activemq.apache.org/download.html.點擊地址到5.4.3版本,你可以看到tar和zip格式包。(tar包是Linux和Unix,zip是Windows)。下載完后解壓。我的解壓到了E:\tools\apache-activemq-5.4.3從命令行進入apache-activemq-5.4.3目錄,輸入如下命令。LICENSE----Apache Software Foundation(ASF)要求的一個文件.包含ActiveMQ使用的所有庫的許可證.NOTICE----ASF要求的另一個文件.包含ActiveMQ使用的所有庫的版權信息.README.txt 一個包含一些URL的文檔,使新手可以使用ActiveMQ.WebConsole-README.txt----包含使用ActiveMQ web console使用說明.activemq-all-5.4.3.jar---一個jar包包含ActiveMQ所有東西。放在這里是方便你使用它。bin----包含二進制或可運行文件。ActiveMQ啟動腳本就放在里面。conf--ActiveMQ所有的配置信息。data--日志和持久化文件存儲地方。docs--包含一個簡單的index.html,該文件指向ActiveMQ網站。example----ActiveMQ例子。我們用這些例子來簡單的測試ActiveMQ。lib----所有ActiveMQ所需庫。user-guide.html----一個簡單指引啟動ActiveMQ和運行例子。webapps----ActiveMQ web console和一些網絡演示。下一部分將啟動ActiveMQ并用這些例子驗證它。啟動ActiveMQ在命令行中輸入一下命令,或者直接運行bin目錄下的activemq.bat文件剛才的命令啟動了ActiveMQ代理器和一些連接器,使得客戶端可以通過一些諸如TCP,SSL,STOMP,XMPP協議連接進來。請注意現在ActiveMQ已經啟動,并且客戶端可以通過TCP 61616端口連接進來。最好的方法是使用ActiveMQ自帶的例子來發送和接收消息。下面我們來運行第一個例子。
4、運行ActiveMQ第一個例子這個例子是模擬生產者消費者的例子,生產者產生2000條信息,然后關閉,消費者消費2000信息,然后關閉。下面我們演示一下。重新打開一個DOS窗口,切到MQ目錄的example目錄下,我的是E:\tools\apache-activemq-5.4.3\example然后輸入一下命令最后一行顯示程序在等待2000個message。這是一個消費者。再重新打開DOS窗口并且到MQ目錄下的example目錄,輸入一下命令ant producer,這個是生產者。輸入命令之后你回看到剛才打開的兩個DOS窗口打印出一堆東西看到BUILD SUCCESSFUL說明程序運行成功。消費者窗口變成了如下內容:示例程序演示完畢,觀看別人寫的看著沒啥意思,我們自己寫一個程序,測試一下。
三、運行自己編寫的第一個例子我們自己編寫一個跟上面類似的例子。
1、建立web項目打開myeclipse,新建web項目,內容填下如下:點擊finish。接著在項目根目錄下新建一個lib目錄,然后將我們上面提及的activemq-all-5.4.3.jar拷貝至lib目錄下,并將其加入項目library中如下圖:點擊OK,項目目前的文件夾結構如下:2、編寫代碼在src上右鍵選擇新建class,具體如下:點擊finish。然后輸入如下代碼package com.mq;import java.util.Date;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MapMessage;import javax.jms.MessageProducer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;public class Producer {public static void main(String[] args) {String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = ActiveMQConnection.DEFAULT_BROKER_URL;String subject = "TOOL.DEFAULT";ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user,password,url);try {Connection connection = contectionFactory.createConnection();connection.start();Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createQueue(subject);MessageProducer producer = session.createProducer(destination);for(int i = 0;i<=20;i++){MapMessage message = session.createMapMessage();message.setLong("count", new Date().getTime());Thread.sleep(1000);producer.send(message);System.out.println("--發送消息:"+new Date());}session.commit();session.close();connection.close();} catch (JMSException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}然后再新建一個消費者類如下圖:點擊finish。然后輸入如下代碼package com.mq;import java.util.Date;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MapMessage;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;public class Consumer {public static void main(String[] args) {String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = ActiveMQConnection.DEFAULT_BROKER_URL;String subject = "TOOL.DEFAULT";ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user,password,url);Connection connection;try {connection = connectionFactory.createConnection();connection.start();final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createQueue(subject);MessageConsumer message = session.createConsumer(destination);message.setMessageListener(new MessageListener(){public void onMessage(Message msg) {MapMessage message = (MapMessage)msg;try {System.out.println("--收到消息:"+new Date(message.getLong("count")));session.commit();} catch (JMSException e) {e.printStackTrace();}}});Thread.sleep(30000);session.close();connection.close();} catch (JMSException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}
3、運行程序右鍵運行程序Consumer類,控制臺打印出如下信息:再右鍵運行Producer類,控制臺上打印出來的信息同上。稍等一秒,Producer類的運行控制臺會打印出來如下信息:有信息可知,生產者正在生成消息,切到消費者類的控制臺方法如下:選擇Cosumer,會看到如下信息:由信息可以看到,消費者收到了同等數量的信息。至此我們的第一個程序成功完成。下面將MQ與spring結合使用。
四、spring與activeMQ的簡單整合在做上面的測試例子的時候我們可以看出發送一個簡單的消息,要幾行代碼!其實我們的目的就是發送和接受消息。幸運的是Spring為我們提供了大量的模板。spring為我們提供了JMSTemplate模板。
1、引入spring相關文件和配置我使用的是spring版本是3.1.0.M2,其他版本的也可以,只是配置不同,去spring官網下載zip包,解開后將dist目錄下的所有jar包(根據自己選擇)拷貝到項目lib目錄下并加入項目library中,具體可以參考上面步驟。
在src目錄下新建applicationContext.xml文件并輸入一下內容:
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"default-autowire="byName">
</beans>
打開web.xml并將其內容修改為以下內容:
<?xml version="1.0" encoding="GBK"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml</param-value></context-param><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>
2、配置JMSTemplate模板類似于jdbcTemplate,首先要配置一個ConnectionFactory,之后要開始配置JmsTemplate模板了。最后是配置消息目標了。消息分為隊列和主題兩大類。在applicationContext.xml中加入如下內容:
<!-- 配置Jms模板 --><bean id="jmsTemplate"class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="destination" /><property name="receiveTimeout" value="10000" /></bean><!-- 配置JMS連接工廠 --><bean id="connectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61616" /></bean><!-- 發送消息的目的地(隊列) --><bean id="destination"class="org.apache.activemq.command.ActiveMQQueue"><!-- 設置消息隊列的名字 --><constructor-arg index="0" value="myQueue" /></bean>
配置完成了,那么如何使用JmsTemplate發送消息呢?spring的beanfactory得到一個jmsTemplate的實例和消息目標的實例,發送消息,夠簡單的吧。下面我們就來編寫具體代碼。
3、編寫代碼
新建類ProducerService.java,界面如下:代碼如下:
package com.mq.service;public interface ProducerService {public void send();
}
新建一個生產者實現類ProducerServiceImpl.java,界面略,代碼如下:
package com.mq.service;import java.util.Date;import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;public class ProducerServiceImpl implements ProducerService {JmsTemplate jmsTemplate;Destination destination;public void send() {MessageCreator messageCreator = new MessageCreator(){public Message createMessage(Session session) throws JMSException {MapMessage message = session.createMapMessage();message.setLong("count", new Date().getTime());System.out.println("--發送消息:"+new Date());return message;}};jmsTemplate.send(this.destination,messageCreator);}public void setJmsTemplate(JmsTemplate jmsTemplate) {this.jmsTemplate = jmsTemplate;}public void setDestination(Destination destination) {this.destination = destination;}
}生產者編寫完了,下面我們來編寫消費者,上面說了,發送消息的時候,spring的beanfactory得到一個jmsTemplate的實例和消息目標的實例,然后發送,那么接受的時候肯定也是得到一個jmsTemplate的實例和消息目標的實例,然后接受,下面我們來看具體代碼。新建一個消費者的借口和實現類,具體代碼如下:ConsumerService.java
package com.mq.service;public interface ConsumerService {public void receive();
}ConsumerServiceImpl.java
package com.mq.service;import java.util.Date;import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;import org.springframework.jms.core.JmsTemplate;public class ConsumerServiceImpl implements ConsumerService {JmsTemplate jmsTemplate;Destination destination;public void receive() {MapMessage message = (MapMessage)jmsTemplate.receive();try {System.out.println("--收到消息:"+new Date(message.getLong("count")));} catch (JMSException e) {e.printStackTrace();}}public void setJmsTemplate(JmsTemplate jmsTemplate) {this.jmsTemplate = jmsTemplate;}public void setDestination(Destination destination) {this.destination = destination;}}代碼編寫完畢,下面要進行bean的配置,在applicationContext.xml中加入如下代碼:
<bean id="producerService"class="com.mq.service.ProducerServiceImpl"><property name="jmsTemplate" ref="jmsTemplate" /><property name="destination" ref="destination" /></bean><bean id="consumerService"class="com.mq.service.ConsumerServiceImpl"><property name="jmsTemplate" ref="jmsTemplate" /><property name="destination" ref="destination" /></bean>
附上完整的applicationContext.xml的內容:
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"default-autowire="byName"><bean id="producerService"class="com.mq.service.ProducerServiceImpl"><property name="jmsTemplate" ref="jmsTemplate" /><property name="destination" ref="destination" /></bean><bean id="consumerService"class="com.mq.service.ConsumerServiceImpl"><property name="jmsTemplate" ref="jmsTemplate" /><property name="destination" ref="destination" /></bean><!-- 配置Jms模板 --><bean id="jmsTemplate"class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="destination" /><property name="receiveTimeout" value="10000" /></bean><!-- 配置JMS連接工廠 --><bean id="connectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61616" /></bean><!-- 發送消息的目的地(隊列) --><bean id="destination"class="org.apache.activemq.command.ActiveMQQueue"><!-- 設置消息隊列的名字 --><constructor-arg index="0" value="myQueue" /></bean>
</beans>
4、編寫測試程序需要的業務代碼都已編寫完畢,下面編寫測試代碼。新建一個生產者的測試類ProducerTest.java。具體代碼如下:
package com.mq.service;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ProducerTest {private static ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");private static void send() {ProducerService producerService = (ProducerService) appContext.getBean("producerService");producerService.send();}/*** @param args*/public static void main(String[] args) {send();}}再建一個消費者的測試類,ConsumerTest.java,具體代碼如下:
package com.mq.service;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ConsumerTest {private static ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");private static void receive() {ConsumerService consumerService = (ConsumerService) appContext.getBean("consumerService");consumerService.receive();}/*** @param args*/public static void main(String[] args) {receive();}}
5、運行程序所有代碼都編寫完了,我們來看一下我們的勞動成果。運行生產者測試類。控制臺打印出如下內容,紅線標注的冒號后面就是我們發送的內容:運行消費者測試類。控制臺打印出如下內容,紅線標注的冒號后面就是我們接受的內容:兩者是一樣的。看來我們的勞動成果沒有白費。以上是一些AciveMQ的基本應用,在接下來的時間,我會寫一些高級應方面的文章,敬請關注本人百度空間和新郎微博。也歡迎各位通過一下兩種途徑和我進行交流,共同進步。推薦一下本人的微博,作為程序員,生活是非常枯燥的(一般都是很枯燥的,哪些以此為樂的不涉及),平時要自己豐富一下自己的業余生活,看些搞笑微博之類的。我每天都會發布一些糗事,歡迎大家關注。另外我在網上看到過有句話——程序員活該你單身身的,程序員招誰惹誰了啊,我們就應該單身。不過話又說回來了,程序員的生活確實單調,感情不豐富,不會說話,但是不能怨我們,其實我們也不想這樣。推薦關注新浪微博一千零一夜話,微博地址:http://weibo.com/1968007227/,每天發布一條夜話,你懂得,希望各位程序猿每天能給自己的另一位一句溫馨的話,不要成為苦逼的娃。
五、參考內容1、http://yunzhongxia.iteye.com/blog/5667272、ActiveMQ in action3、apache官網
轉載于:https://www.cnblogs.com/jiangu66/p/3212331.html
總結
以上是生活随笔為你收集整理的关于ActiveMQ的一点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞思卡尔总结
- 下一篇: 桌面图标有阴影怎么去掉