SpringBoot2整合Jms超級簡單攻略(基於ActiveMQ)
阿新 • • 發佈:2019-01-01
[概念解說]
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}>