JMS 入門小 Demo
點對點模式
點對點的模式主要建立在一個隊列上面,當連接一個列隊的時候,發送端不需要知道接
收端是否正在接收,可以直接向 ActiveMQ 發送消息,發送的消息,將會先進入隊列中,如
果有接收端在監聽,則會發向接收端,如果沒有接收端接收,則會保存在 activemq 服務器,
直到接收端接收消息,點對點的消息模式可以有多個發送端,多個接收端,但是一條消息,
只會被一個接收端給接收到,哪個接收端先連上 ActiveMQ,則會先接收到,而後來的接收
端則接收不到那條消息。
1.引入依賴
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.13.4</version>
</dependency>
2.消息生產者
// 1.1創建鏈接工廠對象
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.132:61616");
// 1.2創建連接
Connection connection = connectionFactory.createConnection();
// 1.3開啓連接
connection.start();
// 2.1獲取 session (參數 1:是否啓動事務,參數 2:消息確認模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 2.2創建主題對象、訂閱
Topic topic = session.createTopic("my_topic");
//2.2創建隊列對象
//Queue queue = session.createQueue("my_queue");
// 2.3創建息生產者
MessageProducer producer = session.createProducer(topic);
//2.3創建消息生產者
//MessageProducer producer = session.createProducer(queue);
// 2.4創建消息
TextMessage textMessage = session.createTextMessage("歡迎訂閱平郵購");
// 3發送消息
producer.send(textMessage);
// 4關閉資源
producer.close();
session.close();
connection.close();
上述代碼創建 session 的兩個參數:
第 1 個參數 是否使用事務
第 2 個參數 消息的確認模式:
- AUTO_ACKNOWLEDGE = 1 自動確認
- CLIENT_ACKNOWLEDGE = 2 客戶端手動確認
- DUPS_OK_ACKNOWLEDGE = 3 自動批量確認
- SESSION_TRANSACTED = 0 事務提交併確認
3.消息的消費者
// 1.1創建連接工廠
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.132:61616");
// 1.2創建連接
Connection connection = connectionFactory.createConnection();
// 1.3開啓連接
connection.start();
// 2.1創建會話
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 2.2創建隊列
Topic topic = session.createTopic("my_topic");
//2.2創建隊列
//Queue queue = session.createQueue("my_queue");
// 2.3創建消息的消費者
MessageConsumer consumer = session.createConsumer(topic);
//2.3創建消息的消費者
//MessageConsumer consumer = session.createConsumer(queue);
// 3設置監聽消息
consumer.setMessageListener(new MessageListener() {
// 消息監聽器的方法
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage)message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
// 等待錄入
System.in.read();
// 4關閉資源
consumer.close();
session.close();
connection.close();
同時開啓 2 個以上的消費者,再次運行生產者,觀察每個消費者控制檯的輸出,會發現
每個消費者會接收到消息。