在官網下載ActiveMQ安裝包后,打開安裝目錄下的/bin/win64/InstallService.bat文件即可安裝ActiveMQ服務。可打開服務面板,啟動ActiveMQ服務。
瀏覽器打開http://localhost:8161/頁面,即可進入ActiveMQ管理頁面,初始賬號密碼均為admin
一、隊列模式
(一)概念
隊列模式又稱點對點模式(Point-to-Point Messaging Domain)。
在點對點通信模式中,應用程序由消息隊列,發送方,接收方組成。每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留著消息,直到他們被消費或超時。
特點:
每個消息只要一個消費者
發送者和接收者在時間上是沒有時間的約束,也就是說發送者在發送完消息之后,不管接收者有沒有接受消息,都不會影響發送方發送消息到消息隊列中。
發送方不管是否在發送消息,接收方都可以從消息隊列中去到消息
-
接收方在接收完消息之后,需要向消息隊列應答成功
(二)代碼實現
生產者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppProducer {
private static final String url = "tcp://127.0.0.1:61616";
private static final String queueName="queue-test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//創建隊列目標
Destination destination = session.createQueue(queueName);
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 100; i++) {
TextMessage message = session.createTextMessage("message"+i);
producer.send(message);
System.out.println("發送消息:"+message.getText());
}
connection.close();
}
}
消費者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppConsumer {
private static final String url = "tcp://127.0.0.1:61616";
private static final String queueName="queue-test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(queueName);
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("接收消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//connection.close();
}
}
二、主題模式
(一)概念
主題模式又稱發布/訂閱模式(Publish/Subscribe Messaging Domain )。
在發布/訂閱消息模型中,發布者發布一個消息,該消息通過topic傳遞給所有的客戶端。該模式下,發布者與訂閱者都是匿名的,即發布者與訂閱者都不知道對方是誰。并且可以動態的發布與訂閱Topic。Topic主要用于保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。
特點:
一個消息可以傳遞個多個訂閱者(即:一個消息可以有多個接受方)
發布者與訂閱者具有時間約束,針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之后,才能消費發布者的消息,而且為了消費消息,訂閱者必須保持運行的狀態。
-
為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。
(二)代碼實現
生產者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppProducer {
private static final String url = "tcp://127.0.0.1:61616";
private static final String topicName="topic-test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//創建主題目標
Destination destination = session.createTopic(topicName);
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 100; i++) {
TextMessage message = session.createTextMessage("message"+i);
producer.send(message);
System.out.println("發送消息:"+message.getText());
}
connection.close();
}
}
消費者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppConsumer {
private static final String url = "tcp://127.0.0.1:61616";
private static final String topicName="topic-test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic(topicName);
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("接收消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//connection.close();
}
}
- 進入127.0.0.1:8161/admin頁面,點擊Queue可查看隊列消息,點擊Topic可查看主題消息。
- 【兩種方式代碼差別不大,僅僅修改目標對象即可。】
//創建隊列目標
Destination destination = session.createQueue(queueName);
//創建主題目標
Destination destination = session.createTopic(topicName);