說明:acitveMQ 版本爲:5.9.1,springboot 版本爲 2.0.3html
官方下載地址:點我跳轉,選擇 windows 安裝包下載,而後解壓,解壓後運行 bin 目錄下的activemq.bat啓動服務,無報錯便可啓動成功。默認管理地址爲:localhost:8161/admin,默認管理員帳號密碼爲admin/admin。java
建立 springboot web 項目,加入 spring-boot-starter-activemq 依賴。git
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
複製代碼
而後編輯配合文件,加上一個配置:61616 爲 activeMQ 的默認端口,暫時不作其餘配置,使用默認值。github
spring:
activemq:
broker-url: tcp://localhost:61616
複製代碼
springboot 中 activeMQ 的默認配置爲生產-消費者模式,還有一種模式爲發佈-訂閱模式後面再講。項目目錄以下:web
首先編寫配置類 Config.java,代碼以下spring
@Configuration
public class Config {
@Bean(name = "queue2")
public Queue queue2(){
return new ActiveMQQueue("active.queue2");
}
@Bean(name = "queue1")
public Queue queue1(){
return new ActiveMQQueue("active.queue1");
}
}
複製代碼
上面的代碼創建了兩個消息隊列 queue1,queue2,分別由 queue1 和 queue2 這兩個 Bean 注入到 Spring 容器中。程序運行後會在 activeMQ 的管理頁面->queue 中看到以下:apache
生產者 Producer.java 代碼以下:windows
@RestController
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired()
@Qualifier("queue2")
private Queue queue2;
@Autowired()
@Qualifier("queue1")
private Queue queue1;
@GetMapping("/queue2")
public void sendMessage1(String message){
jmsMessagingTemplate.convertAndSend(queue2,"I'm from queue2:"+message);
}
@GetMapping("/queue1")
public void sendMessage2(String message){
jmsMessagingTemplate.convertAndSend(queue1,"I'm from queue1:"+message);
}
}
複製代碼
上面的類建立了兩個 GET 接口,訪問這兩個接口分別向 queue1 和 queue2 中發送消息。springboot
消費者 Comsumer.java 代碼以下:bash
@Component //將該類註解到Spring 容器中
public class Comsumer {
//接受消息隊列1消息
@JmsListener(destination = "active.queue1") //監聽active.queue1消息隊列
public void readActiveQueue11(String message){
System.out.println(1+message);
}
//接受消息隊列1消息
@JmsListener(destination = "active.queue1")
public void readActiveQueue12(String message){
System.out.println(2+message);
}
//接受消息隊列2消息
@JmsListener(destination = "active.queue2")
public void readActiveQueue21(String message){
System.out.println(1+message);
}
//接受消息隊列2消息
@JmsListener(destination = "active.queue2")
public void readActiveQueue22(String message){
System.out.println(2+message);
}
}
複製代碼
上面的代碼定義了 4 個消費者,每兩個消費一個消息隊列。
啓動項目後分別向/queue1?message=niihao,/queue2?message=nihaoa 發送 http 請求,而後咱們能夠在控制檯中看到以下輸出:
2I'm from queue2:nihaoa 1I'm from queue2:nihaoa
2I'm from queue1:nihao 1I'm from queue1:nihao
複製代碼
消息都成功被消費者消費,從打印結果也可看出生產者消費者的一個特色:一個消息只會被一個消費者消費。同時在管理頁面中能夠看到:
每一個消息隊列有兩個消費者,隊列進入了三個消息,出了三個消息,說明消息都被消費掉了,若是註釋掉消費者代碼,再次運行,而後發送消息就會發現 MessagesEnqueued 數量大於 MessagesDequeued,而後再讓消費者上線會當即消費掉隊列中的消息。
本文原創發佈於:www.tapme.top/blog/detail…