JMS:Java Message Service應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序
之間,或分佈式系統中發消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS
提供支持。
啓動:下載apache-mq後bin目錄下對應系統(win32/win64)activemq.bat爲啓動項目,用戶名:admin 密碼:admin網頁訪問地址:http://localhost:8161/admin/ 對應可以看到Queues/Topics等標籤
配置:application.propertity
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
springBoot添加ActiveMQ支持:spring-boot-starter-activemq
優勢:異步,可靠(JMS保證消息只會傳遞一次)
點對點消息模型,又稱消費生產模型:每個消息只有一個接受者,消息發送者和消息接受者沒有時間依賴性,當消息發送者
發送消息時,無論接收者在不在運行,都能獲取到消息,當接收者收到消息的時候,會發送確認收到
通知(achnowledgement),多個消費者會輪流消費隊列中的消息,ActiveMQQueue
//生產者@Service
public class Producer {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
// 發送消息,destination是發送到的隊列,message是待發送的消息
public void sendMessage(String destinationName, final String message){
System.out.println("***************>>>>>>>>>發送queue消息 " + message);
Destination destination = new ActiveMQQueue(destinationName);
jmsMessagingTemplate.convertAndSend(destination, message);
}
}
//消費者
@Service
public class Consumer {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
public void receiveQueue(String text) {
System.out.println("Consumer收到的報文爲:"+text);
}
}
發佈/訂閱消息傳送模型:發佈者發佈一個消息,通過topic傳遞給所有的客戶端,一個消息可以傳遞給多個訂閱者,發佈者和訂閱者有時間依賴性,只有當客戶端創建訂閱後才能接受消息,且訂閱者需一直保持活動狀態以接收消息。爲了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。ActiveMQTopic
@Service
public class Publisher {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
public void publish(String destinationName,String message){
ActiveMQTopic destination = new ActiveMQTopic(destinationName);
System.out.println("***************>>>>>>>>>發佈topic消息 " + message);
jmsMessagingTemplate.convertAndSend(destination, message);
}
}
@Service
public class Subscriber {
@JmsListener(destination = "mytest.topic", containerFactory = "jmsListenerContainerFactory")
public void subscribe(String text){
System.out.println("**********<<<<<<1收到的訂閱消息爲:"+text);
}
@Bean
JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
}