開發環境
AMQ 5.14.5 服務啟動執行
準備Java Maven專案
依賴jar包在apache-activemq-5.14.5根目錄下即可找到,或者直接Maven依賴:
org.apache.activemq
activemq-all
點對點模型
2.1 佇列訊息傳送者
編寫 QueueProducer.java 如下:
package com.jastar.activemq.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
- 佇列訊息-傳送(生產)者
*
- ClassName: QueueProducer
*
- Copyright: (c)2017 JASTAR·WANG,All rights reserved.
*
/ 預設使用者名稱 */public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;/ 預設密碼 /public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;/** 預設連線地址(格式如:tcp://IP:61616) /public static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;/ 佇列名稱 */public static final String QUEUE_NAME = "hello amq";// 連線工廠(在AMQ中由ActiveMQConnectionFactory實現)private ConnectionFactory connectionFactory;// 連線物件private Connection connection;// 會話物件private Session session;// 訊息目的地(對於點對點模型,是Queue物件;對於釋出訂閱模型,是Topic物件;它們都繼承或實現了該介面)private Destination destination;// 訊息傳送(生產)者private MessageProducer messageProducer;public static void main(String[] args) { QueueProducer producer = new QueueProducer(); producer.doSend();}public void doSend() { try { / 1.建立連線工廠
建構函式有多個過載,預設連線本地MQ伺服器,也可以手動設定使用者名稱、密碼、連線地址資訊
new ActiveMQConnectionFactory(userName, password, brokerURL) / connectionFactory = new ActiveMQConnectionFactory(); / 2.建立連線 / connection = connectionFactory.createConnection(); / 3.啟動連線 / connection.start(); / 4.建立會話
param1:是否支援事務,若為true,則會忽略第二個引數,預設為SESSION_TRANSACTED
param2:確認訊息模式,若第一個引數為false時,該引數有以下幾種狀態
-Session.AUTO_ACKNOWLEDGE:自動確認。客戶端傳送和接收訊息不需要做額外的工作,即使接收端發生異常, 也會被當作正常傳送成功
-Session.CLIENT_ACKNOWLEDGE:客戶端確認。客戶端接收到訊息後,必須呼叫message. acknowledge() 方法給予收到反饋,JMS伺服器才會把該訊息當做傳送成功,並刪除
-Session.DUPS_OK_ACKNOWLEDGE:副本確認。一旦接收端應用程式的方法呼叫從處理訊息處返回, 會話物件就會確認訊息的接收,而且允許重複確認。 / session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); / 5.建立(傳送)訊息目的地,即佇列,引數為佇列名稱 / destination = session.createQueue(QUEUE_NAME); / 6.建立一個訊息生產者,並指定目的地 / messageProducer = session.createProducer(destination); / 其他操作: 設定生產者的生產模式,預設為持久化
引數有以下兩種狀態:
-DeliveryMode.NON_PERSISTENT:訊息不持久化,訊息被消費之後或者超時之後將從佇列中刪除 -DeliveryMode.PERSISTENT:訊息會持久化,即使接收端消費訊息之後仍然會儲存 / messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); /** 其他操作:設定訊息的存活時間(單位:毫秒) / messageProducer.setTimeToLive(60000); for (int i = 0; i < 5; i++) { /** 7.建立文字訊息
此外,還有多種型別的訊息如物件,位元組……都可以通過session.createXXXMessage()方法建立 / TextMessage message = session.createTextMessage("send content:" + i); / 8. 傳送 / messageProducer.send(message); } System.out.println("訊息傳送完成!"); / 如果有事務操作也可以提交事務 / session.commit(); / 9.關閉生產者物件(即使關閉了程式也在執行) / messageProducer.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { try { / 10.關閉連線(將會關閉程式) / connection.close(); } catch (Exception e) { e.printStackTrace(); } } }}
}
2.2 佇列訊息接收者
編寫 QueueConsumer.java 其他同上,注意註釋部分:
package com.jastar.activemq.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
- 佇列訊息-接收(消費)者
*
- ClassName: QueueConsumer
*
- Copyright: (c)2017 JASTAR·WANG,All rights reserved.
*
private ConnectionFactory connectionFactory;private Connection connection;private Session session;private Destination destination;// 注意這裡是訊息接收(消費)者private MessageConsumer messageConsumer;public static void main(String[] args) { QueueConsumer consumer = new QueueConsumer(); consumer.doReceive();}public void doReceive() { try { connectionFactory = new ActiveMQConnectionFactory(); connection = connectionFactory.createConnection(); connection.start(); session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); destination = session.createQueue(QueueProducer.QUEUE_NAME); / 注意:這裡要建立一個訊息消費,並指定目的地(即訊息源佇列) / messageConsumer = session.createConsumer(destination); // 方式一:監聽接收 receiveByListener(); // 方式二:阻塞接收 // receiveByManual(); / 注意:這裡不能再關閉物件了 / // messageConsumer.close(); } catch (Exception e) { e.printStackTrace(); } finally { / 注意:這裡不能再關閉Connection了 / // connection.close(); }}/* 通過註冊監聽器的方式接收訊息,屬於被動監聽/private void receiveByListener() { try { messageConsumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { if (message instanceof TextMessage) { try { TextMessage msg = (TextMessage) message; System.out.println("Received:“" + msg.getText() + "”"); // 可以通過此方法反饋訊息已收到 msg.acknowledge(); } catch (Exception e) { e.printStackTrace(); } } } }); } catch (Exception e) { e.printStackTrace(); }}/** 通過手動去接收訊息的方式,屬於主動獲取/private void receiveByManual() { while (true) { try { /** 通過receive()方法阻塞接收訊息,引數為超時時間(單位:毫秒) */ TextMessage message = (TextMessage) messageConsumer .receive(60000); if (message != null) { System.out.println("Received:“" + message.getText() + "”"); } } catch (Exception e) { e.printStackTrace(); } }
釋出訂閱模型
3.1 主題訊息傳送者
和點對點模型的傳送者唯一不同的是——建立目的地Destination的時候是通過 session.createTopic(); 來建立,其他的使用套路如同 QueueProducer.java ,在此不再貼程式碼,最後我會留下示例程式碼地址,需要的可以去down下看看。
3.2 主題訊息接收者
編寫 TopicConsumer.java ,如下:
package com.jastar.activemq.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
- 主題訊息-接收(消費)者
*
- ClassName: TopicConsumer
*
- Copyright: (c)2017 JASTAR·WANG,All rights reserved.
*
public static void main(String[] args)
{ /* Pub/Sub模型中,訊息可被多個物件接收,不同於P2P模型 */
TopicConsumer consumer1 = new TopicConsumer();
consumer1.doReceive();
TopicConsumer consumer2 = new TopicConsumer();
consumer2.doReceive();
}
public void doReceive() {
try { connectionFactory = new ActiveMQConnectionFactory();
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(TopicProducer.TOPIC_NAME);
messageConsumer = session.createConsumer(destination); // 方式一:監聽接收
receiveByListener() ; // 方式二:阻塞接收
//
receiveByManual();
} catch (Exception e) { e.printStackTrace();
}
}
/*** 通過註冊監聽器的方式接收訊息,屬於被動監聽*/
private void receiveByListener() {
try {
messageConsumer.setMessageListener(new MessageListener()
{
@Override public void onMessage(Message message)
{
if (message instanceof TextMessage)
{ try
{ TextMessage msg = (TextMessage) message;
System.out.println("Received:“" + msg.getText() + "”");
} catch (Exception e)
{ e.printStackTrace(); }
} } });
}
catch (Exception e) { e.printStackTrace(); }}
/*** 通過手動去接收訊息的方式,屬於主動獲取*/
private void receiveByManual()
{ while (true)
{ try
{
/** * 通過receive()方法阻塞接收訊息,引數為超時時間(單位:毫秒) */
TextMessage message = (TextMessage) messageConsumer .receive(60000);
if (message != null)
{ System.out.println("Received:“" + message.getText() + "”"); }
} catch (Exception e)
{ e.printStackTrace();
}
}}複製程式碼
}
4.最後說幾句
以上程式碼全部經過我的測試,絕對保證可靠執行
瀏覽器訪問ActiveMQ的Web控制檯(http://localhost:8161/admin),即可看到訊息、佇列、主題等等資訊,在此不再上圖了,懶死了真是……
我確確實實希望本文可以幫助你提升技術水平。那些,感覺學的好難,甚至會令你沮喪的人,別擔心,我認為,如果你願意試一試本文介紹的幾點,會向前邁進,克服這種感覺。這些要點也許對你不適用,但你會明確一個重要的道理:接受自己覺得受困這個事實是擺脫這個困境的第一步。
注:加群要求 學習交流群:450936584
1、想學習JAVA這一門技術, 對JAVA感興趣,想從事JAVA工作的。
2、工作0-5年,感覺自己技術不行,想提升的
3、如果沒有工作經驗,但基礎非常紮實,想提升自己技術的。
4、還有就是想一起交流學習的。
5、小號加群一律不給過,謝謝。
群內每天會分享最新的視訊和資料,可以免費領取學習視訊和資料
轉發此文章請帶上原文連結,否則將追究法律責任!