訊息傳遞

Spring Boot 提供了許多 starter 以支援訊息傳遞。本節回答了使用 Spring Boot 進行訊息傳遞時出現的問題。

停用事務性 JMS 會話

如果你的 JMS 代理不支援事務性會話,你必須完全停用事務支援。如果你建立自己的 JmsListenerContainerFactory,則無需執行任何操作,因為它預設不是事務性的。如果你想使用 DefaultJmsListenerContainerFactoryConfigurer 來重用 Spring Boot 的預設設定,你可以按如下方式停用事務性會話:

  • Java

  • Kotlin

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
	}

}

前面的示例覆蓋了預設工廠,如果你的應用程式定義了任何其他工廠,則應將其應用於這些工廠。

© . This site is unofficial and not affiliated with VMware.