一、JMS消息服務
講消息隊列就不得不提JMS 。JMS(Java Message Service)API是一個消息服務的標準/規範,允許應用程序組件基於JavaEE平臺創建、發送、接收和讀取消息。它使分佈式通信耦合度更低,消息服務更加可靠以及異步性。
二、消息模型
在JMS標準中,有兩種消息模型:P2P(Point to Point)點對點模式,Publish/Subscribe(Pub/Sub) 發佈訂閱模式。
三、消息模型(P2P模式)
P2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。
特點:每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中);發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被髮送到隊列;接收者在成功接收消息之後需向隊列應答成功。
如果希望發送的每個消息都會被成功處理的話,那麼需要P2P模式
四、消息模型(Pub/Sub模式)
包含三個角色主題(Topic),發佈者(Publisher),訂閱者(Subscriber) 多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
Pub/Sub的特點:a.每個消息可以有多個消費者 b.發佈者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發佈者的消息 c.爲了消費消息,訂閱者必須保持運行的狀態.
爲了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發佈者的消息。如果希望發送的消息可以不被做任何處理、或者只被一個消費者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。
五、操作步驟+測試代碼
public class P2PDemo {
@Test
//生產者
public void fun1() throws Exception{
//鏈接工廠
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
//獲得鏈接 初始化了解
Connection connection = factory.createConnection();
connection.start();
//獲取session 參數1 是否使用事物 參數2 事物模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//獲得目標
Queue queue = session.createQueue("測試mq");
//獲取生產者
MessageProducer producer = session.createProducer(queue);
//發佈一條信息
TextMessage textMessage = session.createTextMessage("我是一條文本信息");
producer.send(textMessage);
}
@Test
//消費者
public void fun2() throws Exception{
//鏈接工廠
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
//獲得鏈接 初始化了解
Connection connection = factory.createConnection();
connection.start();
//獲取session 參數1 是否使用事物 參數2 事物模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//獲得目標
Queue queue = session.createQueue("測試mq");
//獲取消費者
MessageConsumer consumer = session.createConsumer(queue);
//獲取消息
TextMessage message = (TextMessage) consumer.receive();
System.out.println(message.getText());
}
}
public class PubSubDemo {
@Test
public void fun1() throws Exception{
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("pub/sub測試");
MessageProducer producer = session.createProducer(topic);
TextMessage textMessage = session.createTextMessage("pubxxxxxxx");
producer.send(textMessage);
}
@Test
//消費者(異步接收消息)
public void fun2() throws Exception{
//鏈接工廠
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
//獲得鏈接 初始化了解
Connection connection = factory.createConnection();
connection.start();
//獲取session 參數1 是否使用事物 參數2 事物模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//獲得目標
Topic topic = session.createTopic("pub/sub測試");
//獲取消費者
MessageConsumer consumer = session.createConsumer(topic);
//註冊接收消息監聽器
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}