JMS

连接工厂接口提供了一种标准的方法来创建连接与JMS经纪人互动。 虽然Spring需要一个连接工厂使用 JMS 通常不需要直接使用,而是可以依赖更高级的消息抽象。 (详情请参见Spring Framework参考文档的相关部分。) Spring Boot 还自动配置发送和接收消息所需的基础设施。spring-doc.cadn.net.cn

ActiveMQ “经典”支持

ActiveMQ “Classic” 在类路径上可用时,Spring Boot 可以配置连接工厂. 如果有代理存在,嵌入式代理会自动启动并配置(前提是配置中未指定代理URL,且配置中未禁用嵌入代理)。spring-doc.cadn.net.cn

如果你使用,Spring-boot-starter-activemq提供了连接 ActiveMQ “经典”实例所需的依赖关系,以及与 JMS 集成的 Spring 基础设施。 添加org.apache.activemq:activemq-broker你的应用允许你使用嵌入式代理。

ActiveMQ“经典”配置由外部配置属性控制,具体为spring.activemq.*.spring-doc.cadn.net.cn

如果ActiveMQ-Broker在类路径上,ActiveMQ“经典版”自动配置为使用虚拟机传输,启动嵌入同一JVM实例中的代理。spring-doc.cadn.net.cn

你可以通过配置spring.activemq.embedded.enabled性质,如下例所示:spring-doc.cadn.net.cn

spring.activemq.embedded.enabled=false
spring:
  activemq:
    embedded:
      enabled: false

如果您配置了代理 URL,嵌入式代理也会被禁用,如下示例所示:spring-doc.cadn.net.cn

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 “经典版”文档获取更多信息。spring-doc.cadn.net.cn

默认情况下,缓存连接工厂包裹本地连接工厂这些设置是你可以通过外部配置属性控制的Spring.JMS.*:spring-doc.cadn.net.cn

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

如果你更想用原生池化,可以通过添加依赖来实现org.messaginghub:pooled-jms以及配置JmsPoolConnectionFactory因此,如下例所示:spring-doc.cadn.net.cn

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring:
  activemq:
    pool:
      enabled: true
      max-connections: 50
ActiveMQProperties更多支持的选项。 你也可以注册任意数量的豆子,实现它们ActiveMQConnectionFactoryCustomizer为了更高级的自定义。

默认情况下,ActiveMQ “Classic” 会创建尚未存在的目的地,以便根据其提供的名称解析目的地。spring-doc.cadn.net.cn

ActiveMQ Artemis 支持

Spring Boot 可以自动配置连接工厂当它检测到类路径上有 ActiveMQ Artemis 时。 如果有代理存在,嵌入式代理会自动启动并配置(除非模式属性已被明确设置)。 支持的模式有嵌入式(明确说明需要嵌入式代理,且如果代理无法出现在类路径上,应发生错误)本地(通过净分传输协议)。 当后者配置时,Spring Boot 配置为连接工厂它连接到运行在本地机器上的代理,默认设置如此。spring-doc.cadn.net.cn

如果你使用,Spring靴-起动-阿尔忒弥斯提供了连接现有 ActiveMQ Artemis 实例所需的依赖,以及与 JMS 集成的 Spring 基础设施。 添加org.apache.activemq:artemis-jakarta-server你的应用允许你使用嵌入式模式。

ActiveMQ Artemis 配置由外部配置属性控制,内容如下Spring。阿尔忒弥斯。*. 例如,你可以声明以下部分application.properties:spring-doc.cadn.net.cn

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(豆子)JMSQueueConfiguration主题配置分别用于高级队列配置和主题配置。spring-doc.cadn.net.cn

默认情况下,缓存连接工厂包裹本地连接工厂这些设置是你可以通过外部配置属性控制的Spring.JMS.*:spring-doc.cadn.net.cn

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

如果你更想使用原生池化,可以通过添加依赖 来实现org.messaginghub:pooled-jms以及配置JmsPoolConnectionFactory因此,如下例所示:spring-doc.cadn.net.cn

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

不涉及JNDI查询,目的地通过名称解析,使用以下几种名称ActiveMQ Artemis 配置中的属性或配置中提供的名称。spring-doc.cadn.net.cn

使用 JNDI ConnectionFactory

如果你在应用服务器上运行应用,Spring Boot 会尝试定位 JMS连接工厂通过使用JNDI。 默认情况下,java:/JmsXAjava:/XAConnectionFactory位置被检查。 你可以使用spring.jms.jndi-name如果你需要指定一个替代位置,就用属性,如下例所示:spring-doc.cadn.net.cn

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

发送消息

斯普林斯JmsClient是自动配置的,你可以直接将其自动接线到你自己的豆子中,如下示例所示:spring-doc.cadn.net.cn

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

@Component
public class MyBean {

	private final JmsClient jmsClient;

	public MyBean(JmsClient jmsClient) {
		this.jmsClient = jmsClient;
	}

	// ...

	public void someMethod() {
		this.jmsClient.destination("myQueue").send("hello");
	}

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

@Component
class MyBean(private val jmsClient: JmsClient) {

	// ...

	fun someMethod() {
		jmsClient.destination("myQueue").send("hello")
	}

}
JmsMessagingTemplate可以以类似方式注射,且两者都使用传统Jms模板这也可以注射。 如果目的地解析器或者消息转换器BEAN 是定义的,它会自动关联到自动配置Jms模板.

接收消息

当JMS基础设施存在时,任何豆子都可以注释为@JmsListener创建监听端点。 如果没有JmsListenerContainerFactory定义后,默认配置会自动设置。 如果目的地解析器一个消息转换器,或ExceptionListener豆子是定义的,它们会自动关联到默认工厂。spring-doc.cadn.net.cn

在大多数情况下,消息监听器容器应与原生配置一致连接工厂. 这样每个听众容器都有自己的连接,从而在本地恢复方面承担全部责任。 自动配置的用途ConnectionFactoryUnwrapper将本地连接工厂从自动配置的工厂拆开。spring-doc.cadn.net.cn

自动配置只会展开缓存连接工厂.

默认情况下,工厂是事务型的。 如果你在一个基础设施中运行,并且JtaTransactionManager存在,默认与监听器容器关联。 如果不是,则会谈交易该标记已启用。 在后一种情况下,你可以将本地数据存储事务与接收消息的处理关联起来,方法是添加@Transactional在你的听众方法(或其代理)上。 这确保了本地事务完成后,收到的消息会被确认。 这也包括发送在同一JMS会话上执行过的响应消息。spring-doc.cadn.net.cn

以下组件在某些队列目的地:spring-doc.cadn.net.cn

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设置和自动配置的一样。spring-doc.cadn.net.cn

例如,以下示例展示了另一个工厂,该工厂使用特定的消息转换器:spring-doc.cadn.net.cn

import jakarta.jms.ConnectionFactory;

import org.springframework.boot.jms.ConnectionFactoryUnwrapper;
import org.springframework.boot.jms.autoconfigure.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,
			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.jms.ConnectionFactoryUnwrapper
import org.springframework.boot.jms.autoconfigure.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,
				  connectionFactory: ConnectionFactory): DefaultJmsListenerContainerFactory {
		val factory = DefaultJmsListenerContainerFactory()
		configurer.configure(factory, ConnectionFactoryUnwrapper.unwrapCaching(connectionFactory))
		factory.setMessageConverter(MyMessageConverter())
		return factory
	}

}
在上述示例中,自定义方式为ConnectionFactoryUnwrapper将原生连接工厂与消息监听器容器关联,就像自动配置的工厂一样。

然后你可以在任何地方使用工厂@JmsListener-注释方法如下:spring-doc.cadn.net.cn

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

}