1. ActiveMQ
1.1. 什麼是ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
主要特點:
-
- 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
-
- 完全支援JMS1.1和J2EE 1.4規範 (持久化,XA訊息,事務)
-
- 對Spring的支援,ActiveMQ可以很容易內嵌到使用Spring的系統裡面去,而且也支援Spring2.0的特性
-
- 通過了常見J2EE伺服器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何相容J2EE 1.4 商業伺服器上
-
- 支援多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
-
- 支援通過JDBC和journal提供高速的訊息持久化
-
- 從設計上保證了高效能的叢集,客戶端-伺服器,點對點
-
- 支援Ajax
-
- 支援與Axis的整合
-
- 可以很容易得呼叫內嵌JMS provider,進行測試
1.2. ActiveMQ的訊息形式
對於訊息的傳遞有兩種型別:
- 是點對點的,即一個生產者和一個消費者一一對應;
- 釋出/訂閱模式,即一個生產者產生訊息並進行傳送後,可以由多個消費者進行接收。
JMS定義了五種不同的訊息正文格式,以及呼叫的訊息型別,允許你傳送並接收以一些不同形式的資料,提供現有訊息格式的一些級別的相容性。
- StreamMessage -- Java原始值的資料流
- MapMessage--一套名稱-值對
- TextMessage--一個字串物件
- ObjectMessage--一個序列化的 Java物件
- BytesMessage--一個位元組的資料流
2. ActiveMQ的安裝
進入http://activemq.apache.org/下載ActiveMQ,使用的版本是5.12.0 2.1. 安裝環境:
- 1、需要jdk
- 2、安裝Linux系統。生產環境都是Linux系統。
2.2. 安裝步驟
- 第一步: 把ActiveMQ 的壓縮包上傳到Linux系統。
- 第二步:解壓縮。
- 第三步:啟動。
使用bin目錄下的activemq命令
啟動:[root@localhost bin]# ./activemq start
關閉:[root@localhost bin]# ./activemq stop
檢視狀態:[root@localhost bin]# ./activemq status
複製程式碼
注意:如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建議使用5.11.2
進入管理後臺:http://192.168.25.168:8161/admin
使用者名稱:admin
密碼:admin
複製程式碼
2.3. 解決405問題:
修改hosts檔案,配置機器名和127.0.0.1的對映關係。
重新啟動Activemq的服務
3. ActiveMQ的使用方法
3.1. Queue
3.1.1. Producer(生產者:生產訊息,傳送端)
把jar包新增到工程中。使用5.11.2版本的jar包。
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
</dependency>
複製程式碼
- 第一步:建立ConnectionFactory物件,需要指定服務端ip及埠號。
- 第二步:使用ConnectionFactory物件建立一個Connection物件。
- 第三步:開啟連線,呼叫Connection物件的start方法。
- 第四步:使用Connection物件建立一個Session物件。
- 第五步:使用Session物件建立一個Destination物件(topic、queue),此處建立一個Queue物件。
- 第六步:使用Session物件建立一個Producer物件。
- 第七步:建立一個Message物件,建立一個TextMessage物件。
- 第八步:使用Producer物件傳送訊息。
- 第九步:關閉資源。
@Test
public void testQueueProducer() throws Exception {
//第一步:建立ConnectionFactory物件,需要指定服務端ip及埠號。
//brokerURL伺服器的ip及埠號
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
// 第二步:使用ConnectionFactory物件建立一個Connection物件。
Connection connection = connectionFactory.createConnection();
// 第三步:開啟連線,呼叫Connection物件的start方法。
connection.start();
// 第四步:使用Connection物件建立一個Session物件。
//第一個引數:是否開啟事務。true:開啟事務,第二個引數忽略。
//第二個引數:當第一個引數為false時,才有意義。訊息的應答模式。1、自動應答2、手動應答。一般是自動應答。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session物件建立一個Destination物件(topic、queue),此處建立一個Queue物件。
//引數:佇列的名稱。
Queue queue = session.createQueue("test-queue");
//第六步:使用Session物件建立一個Producer物件。
MessageProducer producer = session.createProducer(queue);
//第七步:建立一個Message物件,建立一個TextMessage物件。
/*
TextMessage message = new ActiveMQTextMessage();
message.setText("hello activeMq,this is my first test.");
*/
TextMessage textMessage = session.createTextMessage("hello activeMq,this is my first test.");/*//建立一個序列化物件ObjectMessage objectMessage = session.createObjectMessage( new SendMsg());*/
//第八步:使用Producer物件傳送訊息。
producer.send(textMessage);//producer.send(objectMessage);
//第九步:關閉資源。
producer.close();
session.close();
connection.close();
}
複製程式碼
3.1.2. Consumer(消費者:接收訊息)
- 第一步:建立一個ConnectionFactory物件。
- 第二步:從ConnectionFactory物件中獲得一個Connection物件。
- 第三步:開啟連線。呼叫Connection物件的start方法。
- 第四步:使用Connection物件建立一個Session物件。
- 第五步:使用Session物件建立一個Destination物件。和傳送端保持一致queue,並且佇列的名稱一致。
- 第六步:使用Session物件建立一個Consumer物件。
- 第七步:接收訊息。
- 第八步:列印訊息。
- 第九步:關閉資源
@Test
public void testQueueConsumer() throws Exception {
// 第一步:建立一個ConnectionFactory物件。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
// 第二步:從ConnectionFactory物件中獲得一個Connection物件。
Connection connection = connectionFactory.createConnection();
// 第三步:開啟連線。呼叫Connection物件的start方法。
connection.start();
// 第四步:使用Connection物件建立一個Session物件。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session物件建立一個Destination物件。和傳送端保持一致queue,並且佇列的名稱一致。
Queue queue = session.createQueue("test-queue");
// 第六步:使用Session物件建立一個Consumer物件。
MessageConsumer consumer = session.createConsumer(queue);
// 第七步:接收訊息。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
//ObjectMessage message2 = (ObjectMessage) message;
String text = null;
//取訊息的內容
text = textMessage.getText();
// 第八步:列印訊息。
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//等待鍵盤輸入
System.in.read();
// 第九步:關閉資源
consumer.close();
session.close();
connection.close();
}
複製程式碼
3.2. Topic
3.2.1. Producer
使用步驟:
- 第一步:建立ConnectionFactory物件,需要指定服務端ip及埠號。
- 第二步:使用ConnectionFactory物件建立一個Connection物件。
- 第三步:開啟連線,呼叫Connection物件的start方法。
- 第四步:使用Connection物件建立一個Session物件。
- 第五步:使用Session物件建立一個Destination物件(topic、queue),此處建立一個Topic物件。
- 第六步:使用Session物件建立一個Producer物件。
- 第七步:建立一個Message物件,建立一個TextMessage物件。
- 第八步:使用Producer物件傳送訊息。
- 第九步:關閉資源。
@Test
public void testTopicProducer() throws Exception {
// 第一步:建立ConnectionFactory物件,需要指定服務端ip及埠號。
// brokerURL伺服器的ip及埠號
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
// 第二步:使用ConnectionFactory物件建立一個Connection物件。
Connection connection = connectionFactory.createConnection();
// 第三步:開啟連線,呼叫Connection物件的start方法。
connection.start();
// 第四步:使用Connection物件建立一個Session物件。
// 第一個引數:是否開啟事務。true:開啟事務,第二個引數忽略。
// 第二個引數:當第一個引數為false時,才有意義。訊息的應答模式。1、自動應答2、手動應答。一般是自動應答。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session物件建立一個Destination物件(topic、queue),此處建立一個topic物件。
// 引數:話題的名稱。
Topic topic = session.createTopic("test-topic");
// 第六步:使用Session物件建立一個Producer物件。
MessageProducer producer = session.createProducer(topic);
// 第七步:建立一個Message物件,建立一個TextMessage物件。
/*
* TextMessage message = new ActiveMQTextMessage(); message.setText(
* "hello activeMq,this is my first test.");
*/
TextMessage textMessage = session.createTextMessage("hello activeMq,this is my topic test");
// 第八步:使用Producer物件傳送訊息。
producer.send(textMessage);
// 第九步:關閉資源。
producer.close();
session.close();
connection.close();
}
複製程式碼
3.2.2. Consumer(消費者:接收訊息。)
- 第一步:建立一個ConnectionFactory物件。
- 第二步:從ConnectionFactory物件中獲得一個Connection物件。
- 第三步:開啟連線。呼叫Connection物件的start方法。
- 第四步:使用Connection物件建立一個Session物件。
- 第五步:使用Session物件建立一個Destination物件。和傳送端保持一致topic,並且話題的名稱一致。
- 第六步:使用Session物件建立一個Consumer物件。
- 第七步:接收訊息。
- 第八步:列印訊息。
- 第九步:關閉資源
@Test
public void testTopicConsumer() throws Exception {
// 第一步:建立一個ConnectionFactory物件。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
// 第二步:從ConnectionFactory物件中獲得一個Connection物件。
Connection connection = connectionFactory.createConnection();
// 第三步:開啟連線。呼叫Connection物件的start方法。
connection.start();
// 第四步:使用Connection物件建立一個Session物件。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session物件建立一個Destination物件。和傳送端保持一致topic,並且話題的名稱一致。
Topic topic = session.createTopic("test-topic");
// 第六步:使用Session物件建立一個Consumer物件。
MessageConsumer consumer = session.createConsumer(topic);
// 第七步:接收訊息。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
String text = null;
// 取訊息的內容
text = textMessage.getText();
// 第八步:列印訊息。
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.out.println("topic的消費端03。。。。。");
// 等待鍵盤輸入
System.in.read();
// 第九步:關閉資源
consumer.close();
session.close();
connection.close();
}
複製程式碼