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:

spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret

默认情况下,CachingConnectionFactory使用合理的设置包装原生的ConnectionFactory,您可以通过spring.jms.*中的外部配置属性来控制这些设置spring.jms.*

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 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 中声明以下部分:

spring.artemis.mode=native
spring.artemis.broker-url=tcp://192.168.1.210:9876
spring.artemis.user=admin
spring.artemis.password=secret

嵌入代理时,您可以选择是否要启用持久性并列出应可用的目标。这些可以指定为逗号分隔的列表,以使用默认选项创建它们,或者您可以定义 org.apache.activemq.artemis.jms.server.config.JMSQueueConfigurationorg.apache.activemq.artemis.jms.server.config.TopicConfiguration 类型的 bean,分别用于高级队列和主题配置。

默认情况下,CachingConnectionFactory使用合理的设置包装原生ConnectionFactory,您可以通过以下中的外部配置属性来控制这些设置spring.jms.*

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 查找,并且使用ActiveMQ Artemis 配置中的name属性或通过配置提供的名称根据其名称解析目标。

10.1.3. 使用 JNDI ConnectionFactory

如果您在应用程序服务器中运行应用程序,Spring Boot 会尝试ConnectionFactory使用 JNDI 来查找 JMS。默认情况下,会检查java:/JmsXAjava:/XAConnectionFactory位置。如果需要指定替代位置,则可以使用spring.jms.jndi-name属性,如下例所示:

spring.jms.jndi-name=java:/MyConnectionFactory

10.1.4. 发送消息

SpringJmsTemplate是自动配置的,您可以将其直接自动装配到您自己的 bean 中,如以下示例所示:

@Component
public class MyBean {

    private final JmsTemplate jmsTemplate;

    public MyBean(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    // ...

}

JmsMessagingTemplate可以用类似的方式注射。如果定义了一个DestinationResolver或一个MessageConverterbean,它会自动关联到自动配置的JmsTemplate.

10.1.5. 接收消息

当存在 JMS 基础设施时,可以对任何 Bean 进行注释@JmsListener以创建侦听器端点。如果JmsListenerContainerFactory未定义,则自动配置默认值。如果定义了 DestinationResolverMessageConverterjakarta.jms.ExceptionListenerbeans,它们会自动与默认工厂关联。

默认情况下,默认工厂是事务性的。如果您在存在 JtaTransactionManager的基础架构中运行,则默认情况下它会与侦听器容器关联。如果没有,则启用sessionTransacted标志。在后一种情况下,您可以通过在侦听器方法(或其委托)添加@Transactional将本地数据存储事务与传入消息的处理关联起来。这可确保本地事务完成后传入的消息得到确认。这还包括发送在同一 JMS 会话上执行的响应消息。

以下组件在someQueue目标上创建侦听器端点:

@Component
public class MyBean {

    @JmsListener(destination = "someQueue")
    public void processMessage(String content) {
        // ...
    }

}

有关详细信息, 请参阅@EnableJms的Javadoc 。

如果您需要创建更多JmsListenerContainerFactory实例或者想要覆盖默认值,Spring Boot 提供了一个DefaultJmsListenerContainerFactoryConfigurer实例,您可以使用它来初始化一个DefaultJmsListenerContainerFactory与自动配置的实例相同的设置。

例如,以下示例公开了另一个使用特定 MessageConverter的工厂:

@Configuration(proxyBeanMethods = false)
public class MyJmsConfiguration {

    @Bean
    public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        ConnectionFactory connectionFactory = getCustomConnectionFactory();
        configurer.configure(factory, connectionFactory);
        factory.setMessageConverter(new MyMessageConverter());
        return factory;
    }

    private ConnectionFactory getCustomConnectionFactory() {
        return ...
    }

}

然后您可以在任何带@JmsListener注释的方法中使用工厂,如下所示:

@Component
public class MyBean {

    @JmsListener(destination = "someQueue", containerFactory = "myFactory")
    public void processMessage(String content) {
        // ...
    }

}

最后更新于