消息

Spring Boot 提供了多种入门工具以支持消息传递。本节回答使用使用 Spring Boot 消息时产生的问题。spring-doc.cadn.net.cn

禁用交易的JMS会话

如果你的JMS代理不支持交易会话,你必须完全禁用对交易的支持。如果你自己创建JmsListenerContainerFactory,没有什么可做的,因为默认情况下它无法被交易。如果你想使用DefaultJmsListenerContainerFactoryConfigurer要重用 Spring Boot 的默认设置,你可以禁用交易会话,具体如下: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 jmsListenerContainerFactory(ConnectionFactory connectionFactory,
			DefaultJmsListenerContainerFactoryConfigurer configurer) {
		DefaultJmsListenerContainerFactory listenerFactory = new DefaultJmsListenerContainerFactory();
		configurer.configure(listenerFactory, ConnectionFactoryUnwrapper.unwrapCaching(connectionFactory));
		listenerFactory.setTransactionManager(null);
		listenerFactory.setSessionTransacted(false);
		return listenerFactory;
	}

}
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 jmsListenerContainerFactory(connectionFactory: ConnectionFactory,
			configurer: DefaultJmsListenerContainerFactoryConfigurer): DefaultJmsListenerContainerFactory {
		val listenerFactory = DefaultJmsListenerContainerFactory()
		configurer.configure(listenerFactory, ConnectionFactoryUnwrapper.unwrapCaching(connectionFactory))
		listenerFactory.setTransactionManager(null)
		listenerFactory.setSessionTransacted(false)
		return listenerFactory
	}

}

前面的例子覆盖默认工厂,应该应用到你的应用程序定义的其他工厂(如果有的话)。spring-doc.cadn.net.cn