33.1 JMS
javax.jms.ConnectionFactory 接口提供了一种创建 javax.jms.Connection 的标准方法,用于与JMS代理进行交互。虽然Spring需
要 ConnectionFactory 来使用JMS,但您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象。(有关详细信息,请参阅
Spring框架参考文档的 相关部分。)Spring Boot还自动配置发送和接收消息所需的基础结构。
33.1.1 ActiveMQ支持
当ActiveMQ在类路径上可用时,Spring Boot也可以配置 ConnectionFactory 。如果代理存在,则会自动启动并配置嵌入式代理(前提是未通
过配置指定代理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
默认情况下, CachingConnectionFactory 使用 spring.jms.* 中的外部配置属性可以控制的合理设置包装本机 ConnectionFactory :
spring.jms.cache.session-cache-size=5
如果您更愿意使用本机池,则可以通过向 org.messaginghub:pooled-jms 添加依赖项并相应地配置 JmsPoolConnectionFactory 来实现,如
以下示例所示:
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
有关 ActiveMQProperties 更多支持的选项,请参阅 。您还可以注册实现 ActiveMQConnectionFactoryCustomizer 的任意数
量的beans以进行更高级的自定义。
默认情况下,ActiveMQ会创建一个目标(如果它尚不存在),以便根据提供的名称解析目标。
33.1.2阿耳忒弥斯支持
Spring Boot可以在检测到类路径上的Artemis可用时自动配置 ConnectionFactory 。如果存在代理,则会自动启动并配置嵌入式代理(除非
已明确设置mode属性)。支持的模式是 embedded (以明确表示需要嵌入式代理,如果代理路径在类路径上不可用则发生错误)和 native
(使用{11 /连接到代理)传输协议)。配置后者时,Spring Boot使用默认设置配置连接到本地计算机上运行的代理的 ConnectionFactory 。
如果使用 spring-boot-starter-artemis ,则会提供连接到现有Artemis实例的必要依赖项,以及与JMS集成的Spring基础结
构。将 org.apache.activemq:artemis-jms-server 添加到您的应用程序可让您使用嵌入模式。
Artemis配置由 spring.artemis.* 中的外部配置属性控制。例如,您可以在 application.properties 中声明以下部分:
spring.artemis.mode=native
spring.artemis.host=192.168.1.210
spring.artemis.port=9876
spring.artemis.user=admin
spring.artemis.password=secret
嵌入代理时,您可以选择是否要启用持久性并列出应该可用的目标。这些可以指定为逗号分隔列表以使用默认选项创建它们,或者您可以分别为
高级队列和主题配置定义 org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration
或 org.apache.activemq.artemis.jms.server.config.TopicConfiguration 类型的bean。
默认情况下, CachingConnectionFactory 使用 spring.jms.* 中的外部配置属性可以控制的合理设置包装本机 ConnectionFactory :
spring.jms.cache.session-cache-size=5
如果您更愿意使用本机池,则可以通过向 org.messaginghub:pooled-jms 添加依赖关系并相应地配置 JmsPoolConnectionFactory 来实现,
如以下示例所示:
spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
有关 ArtemisProperties 更多支持选项,请参阅
不使用JNDI查找,并使用Artemis配置中的 name 属性或通过配置提供的名称来解析目标名称。
33.1.3使用JNDI ConnectionFactory
如果您在应用程序服务器中运行应用程序,Spring Boot会尝试使用JNDI找到JMS ConnectionFactory 。默认情况下,会检查 java:/JmsXA
和 java:/XAConnectionFactory 位置。如果需要指定备用位置,可以使用 spring.jms.jndi-name 属性,如以下示例所示:
spring.jms.jndi-name=java:/MyConnectionFactory
33.1.4发送消息
Spring的 JmsTemplate 是自动配置的,您可以将其直接自动装入您自己的beans,如以下示例所示:
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 相关联。
33.1.5接收消息
当存在JMS基础结构时,可以使用 @JmsListener 注释任何bean以创建侦听器端点。如果未定义 JmsListenerContainerFactory ,则会自动
配置默认值。如果定义了 DestinationResolver 或 MessageConverter beans,它将自动关联到默认工厂。
默认情况下,默认工厂是事务性的。如果您在存在 JtaTransactionManager 的基础结构中运行,则默认情况下它与侦听器容器关联。如果不
是,则启用 sessionTransacted 标志。在后一种情况下,您可以通过在侦听器方法(或其委托)上添加 @Transactional ,将本地数据存储事
务与传入消息的处理相关联。这确保了在本地事务完成后确认传入消息。这还包括发送已在同一JMS会话上执行的响应消息。
以下组件在 someQueue 目标上创建一个侦听器端点:
@Component
public class MyBean {
@JmsListener(destination = "someQueue")
public void processMessage(String content) {
// ...
}
}
有关 更多详细信息,请参阅 @EnableJms 的Javadoc。
如果您需要创建更多 JmsListenerContainerFactory 实例,或者如果要覆盖默认值,Spring Boot提
供 DefaultJmsListenerContainerFactoryConfigurer ,您可以使用 DefaultJmsListenerContainerFactoryConfigurer 来初始
化 DefaultJmsListenerContainerFactory ,其设置与自动配置。