此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

该接口提供了创建用于与 JMS 代理交互的标准方法。 虽然 Spring 需要 a 来使用 JMS,但你通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象。 (有关详细信息,请参阅 Spring Framework 参考文档的相关部分。 Spring Boot 还会自动配置发送和接收消息所需的基础结构。jakarta.jms.ConnectionFactoryjakarta.jms.ConnectionConnectionFactorySpring中文文档

ActiveMQ“经典”支持

ActiveMQ“Classic”在类路径上可用时,Spring Boot 可以配置 .ConnectionFactorySpring中文文档

如果使用 ,则提供连接到 ActiveMQ“Classic”实例所需的依赖项,以及与 JMS 集成的 Spring 基础结构。spring-boot-starter-activemq

ActiveMQ“Classic”配置由中的外部配置属性控制。 默认情况下,ActiveMQ“Classic”自动配置为使用 TCP 传输,默认情况下连接到 .以下示例显示如何更改默认代理 URL:spring.activemq.*tcp://localhost:61616Spring中文文档

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

默认情况下,a 使用可通过外部配置属性控制的合理设置包装本机:CachingConnectionFactoryConnectionFactoryspring.jms.*Spring中文文档

spring.jms.cache.session-cache-size=5
spring:
  jms:
    cache:
      session-cache-size: 5

如果希望使用本机池,可以通过添加依赖项并相应地配置来执行此操作,如以下示例所示:org.messaginghub:pooled-jmsJmsPoolConnectionFactorySpring中文文档

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring:
  activemq:
    pool:
      enabled: true
      max-connections: 50
请参阅 ActiveMQProperties 以获取更多支持的选项。 您还可以注册任意数量的 Bean,以实现更高级的定制。ActiveMQConnectionFactoryCustomizer

默认情况下,ActiveMQ“Classic”会创建一个目标(如果该目标尚不存在),以便根据其提供的名称解析目标。Spring中文文档

如果使用 ,则提供连接到 ActiveMQ“Classic”实例所需的依赖项,以及与 JMS 集成的 Spring 基础结构。spring-boot-starter-activemq
请参阅 ActiveMQProperties 以获取更多支持的选项。 您还可以注册任意数量的 Bean,以实现更高级的定制。ActiveMQConnectionFactoryCustomizer

ActiveMQ Artemis 支持

Spring Boot 可以在检测到类路径上提供 ActiveMQ Artemis 时自动配置 a。 如果代理存在,则会自动启动和配置嵌入式代理(除非已显式设置模式属性)。 支持的模式是 (明确表示需要嵌入式代理,并且如果代理在类路径上不可用,则应发生错误)和(使用传输协议连接到代理)。 配置后者时,Spring Boot 会使用默认设置配置连接到本地计算机上运行的代理。ConnectionFactoryembeddednativenettyConnectionFactorySpring中文文档

如果使用 ,则提供连接到现有 ActiveMQ Artemis 实例所需的依赖项,以及与 JMS 集成的 Spring 基础结构。 添加到应用程序后,您可以使用嵌入模式。spring-boot-starter-artemisorg.apache.activemq:artemis-jakarta-server

ActiveMQ Artemis 配置由 中的外部配置属性控制。 例如,您可以在以下位置声明以下部分:spring.artemis.*application.propertiesSpring中文文档

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

嵌入代理时,您可以选择是否要启用持久性,并列出应提供的目标。 可以将这些指定为逗号分隔的列表,以使用缺省选项创建它们,也可以分别为高级队列和主题配置定义类型为 或 的 Bean。org.apache.activemq.artemis.jms.server.config.JMSQueueConfigurationorg.apache.activemq.artemis.jms.server.config.TopicConfigurationSpring中文文档

默认情况下,a 使用可通过外部配置属性控制的合理设置包装本机:CachingConnectionFactoryConnectionFactoryspring.jms.*Spring中文文档

spring.jms.cache.session-cache-size=5
spring:
  jms:
    cache:
      session-cache-size: 5

如果希望使用本机池,可以通过添加依赖项并相应地配置 pool 来实现,如以下示例所示:org.messaginghub:pooled-jmsJmsPoolConnectionFactorySpring中文文档

spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
spring:
  artemis:
    pool:
      enabled: true
      max-connections: 50

有关更多支持的选项,请参阅 ArtemisPropertiesSpring中文文档

不涉及 JNDI 查找,并且使用 ActiveMQ Artemis 配置中的属性或通过配置提供的名称根据其名称解析目标。nameSpring中文文档

如果使用 ,则提供连接到现有 ActiveMQ Artemis 实例所需的依赖项,以及与 JMS 集成的 Spring 基础结构。 添加到应用程序后,您可以使用嵌入模式。spring-boot-starter-artemisorg.apache.activemq:artemis-jakarta-server

使用 JNDI ConnectionFactory

如果在应用程序服务器中运行应用程序,那么 Spring Boot 将尝试使用 JNDI 来查找 JMS。 默认情况下,选中 和 位置。 如果需要指定备用位置,可以使用该属性,如以下示例所示:ConnectionFactoryjava:/JmsXAjava:/XAConnectionFactoryspring.jms.jndi-nameSpring中文文档

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

发送消息

Spring 是自动配置的,您可以直接将其自动连接到您自己的 bean 中,如以下示例所示:JmsTemplateSpring中文文档

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");
	}

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

@Component
class MyBean(private val jmsTemplate: JmsTemplate) {

	// ...

	fun someMethod() {
		jmsTemplate.convertAndSend("hello")
	}

}
JmsMessagingTemplate 可以以类似的方式注入。 如果定义了 a 或 bean,则它会自动关联到自动配置的 .DestinationResolverMessageConverterJmsTemplate
JmsMessagingTemplate 可以以类似的方式注入。 如果定义了 a 或 bean,则它会自动关联到自动配置的 .DestinationResolverMessageConverterJmsTemplate

接收消息

当存在 JMS 基础结构时,可以对任何 Bean 进行注释以创建侦听器端点。 如果未定义“否”,则会自动配置默认值。 如果定义了 a、a 或 bean,那么它们将自动与缺省工厂相关联。@JmsListenerJmsListenerContainerFactoryDestinationResolverMessageConverterjakarta.jms.ExceptionListenerSpring中文文档

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

以下组件在目标上创建侦听器终结点:someQueueSpring中文文档

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

@Component
public class MyBean {

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

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

@Component
class MyBean {

	@JmsListener(destination = "someQueue")
	fun processMessage(content: String?) {
		// ...
	}

}
有关更多详细信息,请参阅 @EnableJms 的 Javadoc

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

例如,以下示例公开了另一个使用特定 :MessageConverterSpring中文文档

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 ...
	}

}
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)
class MyJmsConfiguration {

	@Bean
	fun myFactory(configurer: DefaultJmsListenerContainerFactoryConfigurer): DefaultJmsListenerContainerFactory {
		val factory = DefaultJmsListenerContainerFactory()
		val connectionFactory = getCustomConnectionFactory()
		configurer.configure(factory, connectionFactory)
		factory.setMessageConverter(MyMessageConverter())
		return factory
	}

	fun getCustomConnectionFactory() : ConnectionFactory? {
		return ...
	}

}

然后,您可以在任何 -annotated 方法中使用工厂,如下所示:@JmsListenerSpring中文文档

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) {
		// ...
	}

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

@Component
class MyBean {

	@JmsListener(destination = "someQueue", containerFactory = "myFactory")
	fun processMessage(content: String?) {
		// ...
	}

}
有关更多详细信息,请参阅 @EnableJms 的 Javadoc