1. 程式人生 > >SpringBoot2整合Jms超級簡單攻略(基於ActiveMQ)

SpringBoot2整合Jms超級簡單攻略(基於ActiveMQ)

[概念解說]

JMS簡介

JMS是一種與廠商無關的 API,用來訪問訊息收發系統訊息。它類似於JDBC(Java DataBaseConnectivity),也類似於JPA(Java Persistence Api),JDBC 是可以用來訪問許多不同關係資料庫的 API,而 JMS 則提供同樣與廠商無關的訪問方法,以訪問訊息收發服務。

JMS四個重要部分

  • 訊息主題(Topic),需要一個固定的主題,例如大家都是在談論外賣,那主題就是外賣,別人討論其他的跟你無關。
  • 訊息佇列(MQ) ,存放或者實現JMS的功能,需要用到佇列,有人放入訊息到外賣佇列,有人從外賣佇列讀取訊息,就是一個訊息佇列的模型。
  • 傳送者(Sender),通過什麼事或者想做什麼事,就發個資訊,例如點個外賣唄。
  • 接收者(Receiver),然後外賣員就收到資訊,辦事。

MQ簡介

MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。應用程式通過寫和檢索出入列隊的針對應用程式的資料(訊息)來通訊,而無需專用連線來連結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過程呼叫的技術。排隊指的是應用程式通過佇列來通訊。佇列的使用除去了接收和傳送應用程式同時執行的要求。

JMS和MQ的關係

  • JMS是一個用於提供訊息服務的技術規範,它制定了在整個訊息服務提供過程中的所有資料結構和互動流程。
  • MQ則是訊息佇列服務,是面向訊息中介軟體(MOM)的最終實現,是真正的服務提供者。

那麼這個問題就可以理解為:JMS是規範標準,MQ是其中一種有力的實現方式。

ActiveMQ

目前支援JMS的開源MQ,目前選擇比較多,支援比較多的是ActiveMQ。還有阿里的RocketMQ,RabbitMQ等等。

ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。

[實戰部分]

Maven配置

主要用到的JMS核心包如下:

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

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

Java配置檔案

JmsConfig.java


@EnableJms
@Configuration
public class JmsConfig {

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some of Boot's default if necessary.
        return factory;
    }

    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

}

Receiver接收者

只要有傳送者傳送了訊息到”mailbox”這個主題(Topic),接收者就會呼叫這塊邏輯。

@Component
public class Receiver {

    @JmsListener(destination = "mailbox", containerFactory = "myFactory")
    public void receiveMessage(Email email) {
        System.out.println("Received <" + email + ">");
    }

}

Sender傳送者

主動權在你手裡,盡情傳送吧,”mailbox”為訂閱的主題,至於Email裡面有什麼,似乎不是特別重要,只是一個普通的POJO,換成User什麼的都沒問題。

@RestController
public class TestController {
    @Autowired
    private JmsTemplate jmsTemplate;

    /**
     * 傳送訂閱
     */
    @GetMapping("/email/send")
    public Email updateItem(Email item) {
        jmsTemplate.convertAndSend("mailbox", new Email("[email protected]", "Hello"));
        return item;
    }
}

[執行結果]

這裡寫圖片描述

//本地呼叫Controller裡面的內容,進行訊息傳送,這時候Receiver就會收到訊息啦
http://localhost:1111/jms/email/send

//控制檯輸出
Received <Email{to=info@example.com, body=Hello}>

開源專案