1. 程式人生 > >springboot整合ActiveMQ1(基本使用)

springboot整合ActiveMQ1(基本使用)

  • 基本使用,https://www.tapme.top/blog/detail/2018-09-05-10-38
  • 主備模式,https://www.tapme.top/blog/detail/2018-09-06-10-38

說明:acitveMQ 版本為:5.9.1,springboot 版本為 2.0.3

一. 下載安裝(windows)

  官方下載地址:點我跳轉,選擇 windows 安裝包下載,然後解壓,解壓後執行 bin 目錄下的activemq.bat啟動服務,無報錯即可啟動成功。預設管理地址為:localhost:8161/admin,預設管理員賬號密碼為admin/admin。

二. springboot 整合

1. 建立 springboot 專案

  建立 springboot web 專案,加入 spring-boot-starter-activemq 依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

  然後編輯配合檔案,加上一個配置:61616 為 activeMQ 的預設埠,暫時不做其他配置,使用預設值。

spring:
  activemq:
    broker-url: tcp://localhost:61616

2. 建立生產者消費者

  springboot 中 activeMQ 的預設配置為生產-消費者模式,還有一種模式為釋出-訂閱模式後面再講。專案目錄如下:

  首先編寫配置類 Config.java,程式碼如下

@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 中看到如下:

  生產者 Producer.java 程式碼如下:

@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 中傳送訊息。

消費者 Comsumer.java 程式碼如下:

@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 個消費者,每兩個消費一個訊息佇列。

3. 執行

  啟動專案後分別向/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,然後再讓消費者上線會立即消費掉佇列中的訊息。

本文原創釋出於:https://www.tapme.top/blog/detail/2018-09-05-10-38

原始碼:https://github.com/FleyX/demo-project/tree/master/jms_d