JMS系统
这ConnectionFactory
接口提供了一种创建Connection
用于与 JMS 代理交互。
虽然 Spring 需要一个ConnectionFactory
要使用 JMS,您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象。
(有关详细信息,请参阅 Spring Framework 参考文档的相关部分。
Spring Boot 还会自动配置发送和接收消息所需的基础设施。
ActiveMQ“经典”支持
当 ActiveMQ“Classic”在类路径上可用时,Spring Boot 可以配置一个ConnectionFactory
.
如果代理存在,则会自动启动和配置嵌入式代理(前提是未通过配置指定代理 URL,并且未在配置中禁用嵌入式代理)。
如果您使用spring-boot-starter-activemq ,提供了连接到 ActiveMQ“Classic”实例所需的依赖项,以及与 JMS 集成的 Spring 基础设施。
添加org.apache.activemq:activemq-broker 允许您使用嵌入式代理。 |
ActiveMQ“经典”配置由spring.activemq.*
.
如果activemq-broker
在类路径上,则 ActiveMQ“Classic”会自动配置为使用 VM 传输,该传输会启动嵌入在同一 JVM 实例中的代理。
您可以通过配置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” 文档以获取更多信息。
默认情况下,一个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
看ActiveMQProperties 以获取更多支持的选项。
您还可以注册任意数量的 bean,以实现ActiveMQConnectionFactoryCustomizer 用于更高级的自定义。 |
默认情况下,ActiveMQ“经典”会创建一个目标(如果该目标尚不存在),以便根据其提供的名称解析目标。
ActiveMQ Artemis 支持
Spring Boot 可以自动配置ConnectionFactory
当它检测到 ActiveMQ Artemis 在类路径上可用时。
如果代理存在,则会自动启动和配置嵌入式代理(除非已显式设置 mode 属性)。
支持的模式包括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
:
-
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"
嵌入代理时,您可以选择是否要启用持久性并列出应提供的目标。
这些可以指定为逗号分隔的列表以使用默认选项创建它们,或者您可以定义类型为JMSQueueConfiguration
或TopicConfiguration
,分别用于高级队列和主题配置。
默认情况下,一个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 查找,并且使用其中一种name
属性或通过配置提供的名称。
使用 JNDI ConnectionFactory
如果您在应用程序服务器中运行应用程序,Spring Boot 会尝试查找 JMSConnectionFactory
通过使用 JNDI。
默认情况下,java:/JmsXA
和java:/XAConnectionFactory
位置被检查。
您可以使用spring.jms.jndi-name
属性,如果需要指定替代位置,如以下示例所示:
-
Properties
-
YAML
spring.jms.jndi-name=java:/MyConnectionFactory
spring:
jms:
jndi-name: "java:/MyConnectionFactory"
发送消息
Spring的JmsTemplate
是自动配置的,您可以将其直接自动连接到您自己的 bean,如以下示例所示:
-
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 可以以类似的方式注射。
如果DestinationResolver 或MessageConverter bean 时,它会自动与自动配置的JmsTemplate . |
接收消息
当 JMS 基础设施存在时,可以使用@JmsListener
以创建侦听器端点。
如果没有JmsListenerContainerFactory
,则会自动配置默认值。
如果DestinationResolver
一个MessageConverter
或ExceptionListener
bean 被定义,它们会自动与默认工厂相关联。
在大多数情况下,应针对本机ConnectionFactory
.
这样,每个侦听器容器都有自己的连接,这在本地恢复方面赋予了它的全部责任。
自动配置使用ConnectionFactoryUnwrapper
从自动配置的 Factory 中解包本机连接工厂。
自动配置仅展开CachedConnectionFactory . |
默认情况下,默认工厂是事务性的。
如果您在JtaTransactionManager
存在,则默认情况下它与侦听器容器相关联。
如果没有,则sessionTransacted
标志已启用。
在后一种情况下,可以通过添加@Transactional
在您的侦听器方法(或其委托)上。
这可确保在本地事务完成后确认传入消息。
这还包括发送已在同一 JMS 会话上执行的响应消息。
以下组件在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?) {
// ...
}
}
请参阅@EnableJms API 文档了解更多详情。 |
如果您需要创建更多JmsListenerContainerFactory
实例,或者如果你想覆盖默认值,Spring Boot 提供了一个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.unwrapCaching(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.unwrapCaching(connectionFactory))
factory.setMessageConverter(MyMessageConverter())
return factory
}
}
在上面的示例中,自定义使用ConnectionFactoryUnwrapper 以与自动配置工厂相同的方式将本机连接工厂与消息侦听器容器相关联。 |
然后您可以在任何@JmsListener
-annotated 方法如下所示:
-
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?) {
// ...
}
}