安裝ActiveMQ
到Apache官方網站下載最新的ActiveMQ的安裝包,並解壓到本地目錄下,下載鏈接如下:http://activemq.apache.org/do...。
進入bin 目錄,如果我們是32位的機器,就雙擊 win32 目錄下的 activemq.bat,如果是64位機器,則雙擊 win64 目錄下的 activemq.bat ,運行結果如下:
成功之後在瀏覽器輸入 http://127.0.0.1:8161/ 地址,可以看到 ActiveMQ 的管理頁面,用戶名和密碼默認都是 admin
Spring Boot 整合 ActiveMQ
工程結構
添加 pom 依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
config 配置
# activemq
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
#默認爲true表示使用內存的activeMQ,不需要安裝activeMQ server
spring.activemq.in-memory=true
#如果此處設置爲true,需要加如下的依賴包
# <groupId>org.apache.activemq</groupId>
# <artifactId>activemq-pool</artifactId>
# 否則會自動配置失敗,報JmsMessagingTemplate注入失敗
spring.activemq.pool.enabled=false
隊列模式
創建 消息提供者:Producer.java
import javax.jms.Destination;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
@Service
public class Producer {
@Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate對JmsTemplate進行了封裝
private JmsMessagingTemplate jmsTemplate;
// 發送消息,destination是發送到的隊列,message是待發送的消息
public void sendMessage(Destination destination, final String message){
jmsTemplate.convertAndSend(destination, message);
}
}
創建消費者一: Consumer.java
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class Consumer {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
public void receiveQueue(String text) {
System.out.println("Consumer收到的報文爲:"+text);
}
}
創建消費者二:Consumer1 .java
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class Consumer1 {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
public void receiveQueue(String text) {
System.out.println("Consumer1收到的報文爲:"+text);
}
}
測試
創建一個 ActivceMQQueue 對象,表示隊列模式,下面會介紹主題模式。
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.jms.Destination;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JmsApplicationTests {
@Autowired
private Producer producer;
@Test
public void contextLoads() {
Destination destination = new ActiveMQQueue("mytest.queue");
for(int i=0; i<100; i++){
producer.sendMessage(destination, "myname is chhliu!!!");
}
}
}
雙向隊列
使用 @SendTo 註解可以將方法的返回值重新放入到消息隊列中,供其他消費者消費
這裏我們修改 Consumer1.java 增加註解 @SendTo
public class Consumer1 {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
@SendTo("out.queue")
public String receiveQueue(String text) {
System.out.println("Consumer1收到的報文爲:"+text);
return "return message" + text;
}
@JmsListener(destination = "out.queue")
public void outQueue(String text){
System.out.println("Consumer1 outQueue:"+text);
}
}
主題模式
配置文件中需要增加
# 啓用 topic 模式
spring.jms.pub-sub-domain=true
修改 Consumer1 增加對主題的監聽
import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class Consumer1 {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
@SendTo("out.queue")
public String receiveQueue(String text) {
System.out.println("Consumer1 收到的報文爲:"+text);
return "return message" + text;
}
@JmsListener(destination = "out.queue")
public void outQueue(String text){
System.out.println("Consumer1 outQueue:"+text);
}
@JmsListener(destination = "mytest.topic")
public void topicQueue(String text){
System.out.println("Consumer 接收到的 topic 消息:" + text);
}
}
修改測試類
增加發送主題消息
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.jms.Destination;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JmsApplicationTests {
@Autowired
private Producer producer;
@Test
public void contextLoads() {
Destination destination = new ActiveMQQueue("mytest.queue");
Destination topicDestination = new ActiveMQTopic("mytest.topic");
for(int i=0; i<10; i++){
producer.sendMessage(destination, "Queue Message......");
producer.sendMessage(topicDestination, "Topic Message!!!");
}
}
}
消息的結果爲:
沒有出現 隊列消息。此時需要修改我們的監聽,指定出是哪種類型的
增加配置類
這個配置類沒有在那個工程圖上面出現,添加一個類就好。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
修改消費者 Consumer1.java
import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class Consumer1 {
// 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue", containerFactory = "queueListenerFactory")
@SendTo("out.queue")
public String receiveQueue(String text) {
System.out.println("Consumer1 收到的報文爲:"+text);
return "return message" + text;
}
@JmsListener(destination = "out.queue", containerFactory = "queueListenerFactory")
public void outQueue(String text){
System.out.println("Consumer1 outQueue:"+text);
}
@JmsListener(destination = "mytest.topic", containerFactory = "topicListenerFactory")
public void topicQueue(String text){
System.out.println("Consumer 接收到的 topic 消息:" + text);
}
}
重新執行