此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
该接口提供了一种创建用于与 JMS 代理交互的标准方法。
尽管 Spring 需要与 JMS 一起使用,但您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象。
(有关详细信息,请参阅 Spring Framework 参考文档的相关部分。
Spring Boot 还自动配置了发送和接收消息所需的基础设施。jakarta.jms.ConnectionFactory
jakarta.jms.Connection
ConnectionFactory
ActiveMQ “Classic” 支持
当 ActiveMQ “Classic” 在 Classpath 上可用时, Spring Boot 可以配置 .
如果存在代理,则会自动启动并配置嵌入式代理(前提是未通过配置指定代理 URL,并且未在配置中禁用嵌入式代理)。ConnectionFactory
如果您使用 ,则提供了连接到 ActiveMQ “Classic” 实例所需的依赖项,以及与 JMS 集成的 Spring 基础架构。
通过添加到应用程序,您可以使用嵌入式代理。spring-boot-starter-activemq org.apache.activemq:activemq-broker |
ActiveMQ “Classic” 配置由 中的外部配置属性控制。spring.activemq.*
如果 在 classpath 上,则 ActiveMQ “Classic” 将自动配置为使用 VM 传输,这将启动嵌入在同一 JVM 实例中的代理。activemq-broker
您可以通过配置属性来禁用嵌入式代理,如以下示例所示:spring.activemq.embedded.enabled
-
Properties
-
YAML
spring.activemq.embedded.enabled=false
spring:
activemq:
embedded:
enabled: false
如果您配置代理 URL,嵌入式代理也将被禁用,如以下示例所示:
-
Properties
-
YAML
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"
如果您想完全控制嵌入式代理,请参阅 ActiveMQ“Classic”文档以了解更多信息。
默认情况下, a 使用合理的设置包装本机,您可以通过外部配置属性控制这些设置:CachingConnectionFactory
ConnectionFactory
spring.jms.*
-
Properties
-
YAML
spring.jms.cache.session-cache-size=5
spring:
jms:
cache:
session-cache-size: 5
如果您更愿意使用本机池,可以通过添加依赖项并相应地配置来实现,如以下示例所示:org.messaginghub:pooled-jms
JmsPoolConnectionFactory
-
Properties
-
YAML
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring:
activemq:
pool:
enabled: true
max-connections: 50
有关更多支持的选项,请参阅。
您还可以注册任意数量的 bean 来实现更高级的自定义。ActiveMQProperties ActiveMQConnectionFactoryCustomizer |
默认情况下,ActiveMQ “Classic” 会创建一个目标(如果尚不存在),以便根据提供的名称解析目标。
如果您使用 ,则提供了连接到 ActiveMQ “Classic” 实例所需的依赖项,以及与 JMS 集成的 Spring 基础架构。
通过添加到应用程序,您可以使用嵌入式代理。spring-boot-starter-activemq org.apache.activemq:activemq-broker |
有关更多支持的选项,请参阅。
您还可以注册任意数量的 bean 来实现更高级的自定义。ActiveMQProperties ActiveMQConnectionFactoryCustomizer |
ActiveMQ Artemis 支持
Spring Boot 可以在检测到 ActiveMQ Artemis 在 Classpath 上可用时自动配置。
如果存在代理,则会自动启动并配置嵌入式代理(除非已明确设置 mode 属性)。
支持的模式是(明确表示需要嵌入式代理,如果代理在 Classpath 上不可用,则应该发生错误)和(使用传输协议连接到代理)。
配置后者后, Spring Boot 会配置一个,该代理使用默认设置连接到本地计算机上运行的代理。ConnectionFactory
embedded
native
netty
ConnectionFactory
如果您使用 ,则提供了连接到现有 ActiveMQ Artemis 实例所需的依赖项,以及与 JMS 集成的 Spring 基础架构。
通过添加到应用程序,可以使用嵌入式模式。spring-boot-starter-artemis org.apache.activemq:artemis-jakarta-server |
ActiveMQ Artemis 配置由 中的外部配置属性控制。
例如,您可以在 :spring.artemis.*
application.properties
-
Properties
-
YAML
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.JMSQueueConfiguration
org.apache.activemq.artemis.jms.server.config.TopicConfiguration
默认情况下, a 使用合理的设置包装本机,您可以通过外部配置属性控制这些设置:CachingConnectionFactory
ConnectionFactory
spring.jms.*
-
Properties
-
YAML
spring.jms.cache.session-cache-size=5
spring:
jms:
cache:
session-cache-size: 5
如果您更愿意使用本机池,可以通过添加依赖项并相应地配置来实现,如以下示例所示:org.messaginghub:pooled-jms
JmsPoolConnectionFactory
-
Properties
-
YAML
spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
spring:
artemis:
pool:
enabled: true
max-connections: 50
有关更多支持的选项,请参阅。ArtemisProperties
不涉及 JNDI 查找,并且使用 ActiveMQ Artemis 配置中的属性或通过配置提供的名称根据其名称解析目标。name
如果您使用 ,则提供了连接到现有 ActiveMQ Artemis 实例所需的依赖项,以及与 JMS 集成的 Spring 基础架构。
通过添加到应用程序,可以使用嵌入式模式。spring-boot-starter-artemis org.apache.activemq:artemis-jakarta-server |
使用 JNDI ConnectionFactory
如果您在应用程序服务器中运行应用程序,则 Spring Boot 会尝试使用 JNDI 查找 JMS。
默认情况下,将选中 和 location。
如果需要指定备用位置,则可以使用该属性,如以下示例所示:ConnectionFactory
java:/JmsXA
java:/XAConnectionFactory
spring.jms.jndi-name
-
Properties
-
YAML
spring.jms.jndi-name=java:/MyConnectionFactory
spring:
jms:
jndi-name: "java:/MyConnectionFactory"
发送消息
Spring 的 bean 是自动配置的,你可以将其直接自动连接到你自己的 bean 中,如以下示例所示:JmsTemplate
-
Java
-
Kotlin
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 或 a bean,则它会自动关联到 auto-configured 的 。DestinationResolver MessageConverter JmsTemplate |
JmsMessagingTemplate 可以以类似的方式注射。
如果定义了 a 或 a bean,则它会自动关联到 auto-configured 的 。DestinationResolver MessageConverter JmsTemplate |
接收消息
当 JMS 基础结构存在时,可以使用任何 bean 进行注释以创建侦听器端点。
如果未定义 no,则会自动配置默认 1 个。
如果定义了 a 、 a 或 a bean,则它们将自动与默认工厂关联。@JmsListener
JmsListenerContainerFactory
DestinationResolver
MessageConverter
jakarta.jms.ExceptionListener
在大多数情况下,应针对本机配置消息侦听器容器。
这样,每个侦听器容器都有自己的连接,这就赋予了它在本地恢复方面的全部责任。
auto-configuration 用于从自动配置的 Connection Factory 中解包本机连接工厂。ConnectionFactory
ConnectionFactoryUnwrapper
默认情况下,默认工厂是事务性的。
如果您在存在 a 的基础设施中运行,则默认情况下它与侦听器容器相关联。
否则,将启用该标志。
在后一种情况下,您可以通过添加侦听器方法(或其委托)将本地数据存储事务与传入消息的处理相关联。
这可确保在本地事务完成后确认传入消息。
这还包括发送已在同一 JMS 会话上执行的响应消息。JtaTransactionManager
sessionTransacted
@Transactional
以下组件在目标上创建一个侦听器终端节点:someQueue
-
Java
-
Kotlin
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?) {
// ...
}
}
有关更多详细信息,请参阅 API 文档。@EnableJms |
如果你需要创建更多实例,或者想要覆盖默认值,Spring Boot 提供了一个,你可以使用它来初始化一个,其设置与自动配置的设置相同。JmsListenerContainerFactory
DefaultJmsListenerContainerFactoryConfigurer
DefaultJmsListenerContainerFactory
例如,以下示例公开了另一个使用特定 :MessageConverter
-
Java
-
Kotlin
import jakarta.jms.ConnectionFactory;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.boot.jms.ConnectionFactoryUnwrapper;
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,
ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, ConnectionFactoryUnwrapper.unwrap(connectionFactory));
factory.setMessageConverter(new MyMessageConverter());
return factory;
}
}
import jakarta.jms.ConnectionFactory
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer
import org.springframework.boot.jms.ConnectionFactoryUnwrapper
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,
connectionFactory: ConnectionFactory): DefaultJmsListenerContainerFactory {
val factory = DefaultJmsListenerContainerFactory()
configurer.configure(factory, ConnectionFactoryUnwrapper.unwrap(connectionFactory))
factory.setMessageConverter(MyMessageConverter())
return factory
}
}
在上面的示例中,自定义用于将本机连接工厂关联到消息侦听器容器,其方式与自动配置的工厂相同。ConnectionFactoryUnwrapper |
然后,您可以在任何带 -annotated 的方法中使用工厂,如下所示:@JmsListener
-
Java
-
Kotlin
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?) {
// ...
}
}
有关更多详细信息,请参阅 API 文档。@EnableJms |
在上面的示例中,自定义用于将本机连接工厂关联到消息侦听器容器,其方式与自动配置的工厂相同。ConnectionFactoryUnwrapper |