10.1. JMS
jakarta.jms.ConnectionFactory
接口提供了创建与 JMS 代理交互的jakarta.jms.Connection
标准方法。尽管 Spring 需要使用 JMSConnectionFactory
,但您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象。(有关详细信息,请参阅 Spring 框架参考文档的相关部分。)Spring Boot 还会自动配置发送和接收消息所需的基础设施。
10.1.1. ActiveMQ“经典”支持
当ActiveMQ“Classic”在类路径上可用时,Spring Boot 可以配置一个ConnectionFactory
.
如果您使用
spring-boot-starter-activemq
,则会提供连接到 ActiveMQ“经典”实例所需的依赖项,以及与 JMS 集成的 Spring 基础结构。
ActiveMQ“经典”配置由spring.activemq.*
. 默认情况下,ActiveMQ“经典”自动配置为使用TCP 传输,默认连接到tcp://localhost:61616
。以下示例显示如何更改默认代理 URL:
默认情况下,CachingConnectionFactory
使用合理的设置包装原生的ConnectionFactory
,您可以通过spring.jms.*
中的外部配置属性来控制这些设置spring.jms.*
:
如果您更愿意使用本机池,可以通过添加依赖项org.messaginghub:pooled-jms
并进行相应配置来实现JmsPoolConnectionFactory
,如以下示例所示:
请参阅
ActiveMQProperties
参考资料 了解更多支持的选项。您还可以注册任意数量的ActiveMQConnectionFactoryCustomizer
Bean 来实现更高级的自定义。
默认情况下,ActiveMQ“经典”会创建一个目标(如果目标尚不存在),以便根据提供的名称解析目标。
10.1.2. ActiveMQ Artemis 支持
当 Spring Boot 检测到ActiveMQ Artemis在类路径上可用时,它可以自动配置 ConnectionFactory
。如果代理存在,则会自动启动和配置嵌入式代理(除非已显式设置模式属性)。支持的模式是embedded
(明确需要嵌入式代理,并且如果代理在类路径上不可用,则会发生错误)和native
(使用netty
传输协议连接到代理)。配置后者后,Spring Boot 将配置一个ConnectionFactory
连接到使用默认设置在本地计算机上运行的代理 。
如果您使用
spring-boot-starter-artemis
,则会提供连接到现有 ActiveMQ Artemis 实例所需的依赖项,以及与 JMS 集成的 Spring 基础设施。通过添加org.apache.activemq:artemis-jakarta-server
到您的应用程序,您可以使用嵌入模式。
ActiveMQ Artemis 配置由spring.artemis.*
. 例如,您可以在application.properties
中声明以下部分:
嵌入代理时,您可以选择是否要启用持久性并列出应可用的目标。这些可以指定为逗号分隔的列表,以使用默认选项创建它们,或者您可以定义 org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration
或 org.apache.activemq.artemis.jms.server.config.TopicConfiguration
类型的 bean,分别用于高级队列和主题配置。
默认情况下,CachingConnectionFactory
使用合理的设置包装原生ConnectionFactory
,您可以通过以下中的外部配置属性来控制这些设置spring.jms.*
:
如果您更愿意使用本机池,可以通过添加依赖项org.messaginghub:pooled-jms
并进行相应配置来实现JmsPoolConnectionFactory
,如以下示例所示:
请参阅ArtemisProperties
参考资料 了解更多支持的选项。
不涉及 JNDI 查找,并且使用ActiveMQ Artemis 配置中的name
属性或通过配置提供的名称根据其名称解析目标。
10.1.3. 使用 JNDI ConnectionFactory
如果您在应用程序服务器中运行应用程序,Spring Boot 会尝试ConnectionFactory
使用 JNDI 来查找 JMS。默认情况下,会检查java:/JmsXA
和java:/XAConnectionFactory
位置。如果需要指定替代位置,则可以使用spring.jms.jndi-name
属性,如下例所示:
10.1.4. 发送消息
SpringJmsTemplate
是自动配置的,您可以将其直接自动装配到您自己的 bean 中,如以下示例所示:
JmsMessagingTemplate
可以用类似的方式注射。如果定义了一个DestinationResolver
或一个MessageConverter
bean,它会自动关联到自动配置的JmsTemplate
.
10.1.5. 接收消息
当存在 JMS 基础设施时,可以对任何 Bean 进行注释@JmsListener
以创建侦听器端点。如果JmsListenerContainerFactory
未定义,则自动配置默认值。如果定义了 DestinationResolver
、 MessageConverter
或 jakarta.jms.ExceptionListener
beans,它们会自动与默认工厂关联。
默认情况下,默认工厂是事务性的。如果您在存在 JtaTransactionManager
的基础架构中运行,则默认情况下它会与侦听器容器关联。如果没有,则启用sessionTransacted
标志。在后一种情况下,您可以通过在侦听器方法(或其委托)添加@Transactional
将本地数据存储事务与传入消息的处理关联起来。这可确保本地事务完成后传入的消息得到确认。这还包括发送在同一 JMS 会话上执行的响应消息。
以下组件在someQueue
目标上创建侦听器端点:
有关详细信息, 请参阅@EnableJms
的Javadoc 。
如果您需要创建更多JmsListenerContainerFactory
实例或者想要覆盖默认值,Spring Boot 提供了一个DefaultJmsListenerContainerFactoryConfigurer
实例,您可以使用它来初始化一个DefaultJmsListenerContainerFactory
与自动配置的实例相同的设置。
例如,以下示例公开了另一个使用特定 MessageConverter
的工厂:
然后您可以在任何带@JmsListener
注释的方法中使用工厂,如下所示:
最后更新于