参考:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/#boot-features-messaging
Spring Framework为与消息传递系统的集成提供了广泛的支持:从使用JmsTemplate简化JMS API的使用到异步接收消息的完整基础结构。Spring AMQP为“高级消息队列协议”提供了类似的功能集,Spring Boot还为RabbitTemplate和RabbitMQ提供了自动配置选项。 Spring WebSocket本身也支持STOMP消息传递,Spring Boot通过启动器和少量自动配置支持STOMP消息传递。 Spring Boot也支持Apache Kafka。
JMS
javax.jms.ConnectionFactory接口提供了一种创建javax.jms.Connection以与JMS代理进行交互的标准方法。 虽然Spring需要一个ConnectionFactory来使用JMS,但您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象(有关详细信息,请参阅Spring Framework参考文档的相关部分)。Spring Boot还会自动配置发送和接收消息所需的基础结构。
1 ActiveMQ的支持
当SpringBoot在类路径下探测到ActiveMQ时,会自动配置一个ConnectionFactory。如果broker存在,则会自动启动并配置嵌入式代理(只要通过配置未指定broker URL)。
注:假如添加了spring-boot-starter-activemq依赖,则也会添加连接或嵌入ActiveMQ实例所需的依赖项,以及与JMS集成的Spring基础结构。
ActiveMQ可以通过spring.activemq.*进行配置。例如,可以在application.properties配置以下属性:
spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret
还可以通过添加org.apache.activemq:activemq-pool依赖项来池化JMS资源,并相应地配置PooledConnectionFactory:
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
注:查看ActiveActiveMQProperties类获取更多属性。还可以注册实现了ActiveMQConnectionFactoryCustomizer接口的任意数量的bean,自定义更高级的配置。
默认情况下,如果destination不存在,则ActiveMQ会创建destination,因此将根据提供的名称解析destination。
2. Artemis的支持
参考这篇博客:https://blog.csdn.net/guiliguiwang/article/details/82116294
3. 发送消息
Spring的JmsTemplate是自动配置,可以直接通过@AutoWired注入。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final JmsTemplate jmsTemplate;
@Autowired
public MyBean(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
// ...
}
注:JmsMessagingTemplate可以以类似的方式注入。假如定义了DestinationResolver或MessageConverter的bean,它们自动关联到自动配置的JmsTemplate。
4. 接收消息
当存在JMS基础结构时,可以使用@JmsListener对任何bean进行注释以创建监听器端点。 如果未定义JmsListenerContainerFactory,则会自动配置默认值。 如果定义了DestinationResolver或MessageConverter bean,它们将自动关联到默认工厂。
默认情况下,默认工厂是事务性的。 如果在存在JtaTransactionManager的基础结构中运行,则默认情况下它将与侦听器容器关联。 如果不是,则启用sessionTransacted标志。 在后一种情况下,可以通过在监听器方法(或其委托)上添加@Transactional,将本地数据存储事务与传入消息的处理相关联。 这将确保在本地事务完成后确认传入消息。 这还包括发送已在同一JMS会话上执行的响应消息。
以下组件在someQueue destination上创建一个监听器端点:
@Component
public class MyBean {
@JmsListener(destination = "someQueue")
public void processMessage(String content) {
// ...
}
}
注:查看@EnableJms文档获取更多内容。(可以仔细看下这个注解,源码里有很多示例)
假如需要创建更多的JmsListenerContainerFactory实例或者假如只是想要覆盖默认配置,Spring Boot提供了一个DefaultJmsListenerContainerFactoryConfigurer,可以使用它来初始化DefaultJmsListenerContainerFactory,其设置与自动配置的设置相同。
例如,以下示例中自定义了一个使用特定MessageConverter的工厂:
@Configuration
static class JmsConfiguration {
@Bean
public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory());
factory.setMessageConverter(myMessageConverter());
return factory;
}
}
然后使用任意添加了@JmsListener注解的方法使用:
@Component
public class MyBean {
@JmsListener(destination = "someQueue", containerFactory="myFactory")
public void processMessage(String content) {
// ...
}
}