1. 下載windows辦的activeMQ後,在如下目錄能夠啓動:java
2. 啓動後會有如下提示spring
3. 因此咱們能夠經過http://localhost:8161訪問管理頁面,經過tcp://localhost:61616來鏈接消息服務器,用到的用戶名和密碼都在如下文件中(默認爲admin=admin)apache
1. 加入依賴:windows
spring-boot-starter-activemqspringboot
2. 配置鏈接屬性:bash
spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.pool.enabled=false
1. 建立生產者服務器
package com.example.demo8activemq.jms; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.Destination; /** * @author Created by yawn on 2017-10-26 16:15 */ @Service public class Producer { @Resource private JmsMessagingTemplate jmsMessagingTemplate; public void sendMsg(String destinationName, String message) { System.out.println("============>>>>> 發送queue消息 " + message); Destination destination = new ActiveMQQueue(destinationName); jmsMessagingTemplate.convertAndSend(destination, message); } }
2. 建立消費者tcp
package com.example.demo8activemq.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Service; /** * @author Created by yawn on 2017-10-26 16:15 */ @Service public class Consumer { @JmsListener(destination = "test.queue") public void receiveMsg(String text) { System.out.println("<<<<<<============ 收到消息: " + text); } }
注意: @JmsListener是一個可重複的註解,在java7及如下版本jdk中,可使用@JmsListeners代替它。spring-boot
3. 測試類測試
@RunWith(SpringRunner.class) @SpringBootTest public class Demo8ActivemqApplicationTests { @Resource private Producer producer; @Test public void contextLoads() { for (int i = 0; i < 10; i++) { producer.sendMsg("test.queue", "Queue Message " + i); } } }
4. 運行測試
1. 發佈話題
package com.example.demo8activemq.jms; import org.apache.activemq.command.ActiveMQTopic; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.Destination; /** * @author Created by yawn on 2017-10-28 17:09 */ @Service public class Publisher { @Resource private JmsMessagingTemplate jmsMessagingTemplate; public void publish(String destinationName, String message) { Destination destination = new ActiveMQTopic(destinationName); System.out.println("============>>>>> 發佈topic消息 " + message); jmsMessagingTemplate.convertAndSend(destination, message); } }
2. 訂閱話題
package com.example.demo8activemq.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Service; /** * @author Created by yawn on 2017-10-28 17:15 */ @Service public class Subscriber { @JmsListener(destination = "test.topic", containerFactory = "myJmsContainerFactory") public void subscribe(String text) { System.out.println("===========<<<<<<<<收到訂閱的消息" + text); } }
注意: 在pub/sub模式中,對消息的監聽須要對containerFactory進行如下配置
@Bean JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; }
3. 測試
@Test public void test() { for (int i = 0; i < 10; i++) { publisher.publish("test.topic", "Topic Message " + i); } }
按照以上步驟,在springboot中很容易就實現類兩種模式的消息發送和接收。可是jms具體的應用場景是在不一樣的應用程序之間,生產者和消費者每每是在不一樣的應用中的。此外,以上例子中的消息咱們只發送字符串,其實還能夠發送Object類型的消息,甚至可使用messageCreator自定義消息的轉換,而不使用convertAndSend方法默認轉換。
1. 先使用一個只有發送者,沒有消費者或訂閱者的應用發送兩類消息各十條
2. 咱們打開localhost:8161,能夠看到
兩類都曾有十條消息入隊,但只有queues中還存留10條消息。
3. 如今咱們啓動包含消費者和訂閱者的應用程序
果真,只有消費者收到了queues中的消息。
這說明訂閱者接收topic是須要在topic發佈以前訂閱;而生產/消費模式下,消息發出後會存放在隊列中,等待消費者消費。
4. 咱們先啓動兩個包含訂閱者和消費者的程序,再發布消息
兩個訂閱者都收到 topic message 1~9, 而消費者中,一個收到消息 一、三、五、七、9,另外一個收到0、二、四、六、8。
這說明有多個消息接收者時,生產/消費模式下多個消費者會輪流消費隊列中的消息,而pub/sub模式下全部訂閱者都會獲得全部的消息。
以上就是在多個應用程序之間驗證了發佈/訂閱模式和生產/消費模式的不一樣特色。