Spring Boot对JMS的支持

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#messaging.jms

jakarta.jms.ConnectionFactory 接口提供了创建 jakarta.jms.Connection 的标准方法,以便与 JMS 中介进行交互。虽然 Spring 需要使用 ConnectionFactory 来与 JMS 一起工作,但你通常无需直接使用它,而可以依赖更高级别的消息抽象。Spring Boot 还自动配置了发送和接收消息所需的基础设施。

ActiveMQ “Classic” 支持

当 ActiveMQ “Classic” 在类路径上可用时,Spring Boot 可以配置一个 ConnectionFactory

注意:如果使用 spring-boot-starter-activemq,它将提供连接到 ActiveMQ “Classic” 实例所需的依赖项,以及用于与 JMS 集成的 Spring 基础设施。

ActiveMQ “Classic” 的配置是通过 spring.activemq.* 中的外部配置属性进行控制的。默认情况下,ActiveMQ “Classic” 被自动配置为使用 TCP 传输,默认连接到 tcp://localhost:61616。以下示例展示了如何更改默认的代理 URL:

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

提示:还可以注册任意数量的实现 ActiveMQConnectionFactoryCustomizer 接口的 bean,以实现更高级别的自定义。

默认情况下,如果 ActiveMQ “Classic” 中尚不存在目标,则会创建该目标,以便根据提供的名称解析目标。

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

在嵌入代理时,可以选择是否启用持久性,并列出应提供的目的地(destinations )。这些可以指定为逗号分隔的列表,以便使用默认选项创建它们,或者可以定义类型为 org.apache.activemq.artemis.jms.server.config.JMSQueueConfigurationorg.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

不涉及 JNDI 查找,而是根据它们的名称解析目标,使用 ActiveMQ Artemis 配置中的 name 属性或通过配置提供的名称。

使用 JNDI ConnectionFactory

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

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

发送消息

Spring 的 JmsTemplate 是自动配置的,你可以直接将其自动装配到自己的 bean 中,如下所示:

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final JmsTemplate jmsTemplate;

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

    public void someMethod() {
        this.jmsTemplate.convertAndSend("hello");
    }

}

注意JmsMessagingTemplate 也可以以类似的方式注入。如果定义了 DestinationResolverMessageConverter bean,它会自动与自动配置的 JmsTemplate 相关联。

接收消息

当 JMS 基础设施存在时,任何 bean 都可以使用 @JmsListener 注解来创建监听器端点。如果没有定义 JmsListenerContainerFactory,则会自动配置一个默认的工厂。如果定义了 DestinationResolverMessageConverterjakarta.jms.ExceptionListener bean,它们将自动与默认工厂相关联。

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

以下组件在 someQueue 目标上创建了一个监听器端点:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

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

}

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

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

import jakarta.jms.ConnectionFactory;

import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;

@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 注解的方法中使用该工厂,如下所示:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值