微服务架构之Spring Boot(五十五)

2022-05-23 15:37:42 浏览数 (1)

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 ,其设置与自动配置。

0 人点赞