java - 非事务性 jmsTemplate 等待会话结束
问题描述
我希望jmsTemplate.send()
立即发送 jms 消息,而不是在事务结束后发送。
我试过设置isSessionTransacted
,false
但没有帮助。尽管jmsTemplate.send(...)
被执行,但我没有看到它反映在经纪人身上。
我的设置:
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate template = new JmsTemplate(connectionFactory);
//
template.setSessionTransacted(false);
// messages are ack-ed with message.acknowledge()
template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return template;
}
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory factory = new
ActiveMQConnectionFactory(brokerUsername, brokerPassword, brokerURL);
factory.setTransactedIndividualAck(true);
factory.setAlwaysSyncSend(true);
factory.setAlwaysSessionAsync(false);
factory.setUseCompression(true);
return factory;
}
@Bean
public DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory(
ActiveMQConnectionFactory jmsConnectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, jmsConnectionFactory);
factory.setSessionTransacted(false);
factory.setTransactionManager(null);
return factory;
}
有没有办法强制 jmsTemplate 立即发送消息?我正在使用 ActiveMQ 和 Spring Boot 2。
收到消息时,我会执行以下操作:
@JmsListener
public void test(...) {
processRequest(...) // process request here
message.acknowledge();
jmsTemplate.send(...) // send response
// some transaction handling
}
sender receiver
+ +
| |
| |
+--+--+ +----------------------------------> +--+--+
| | | |
| | | |
| | | |
| | | |
| | not sent immediately | |
| | <-----------------------------------+ | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | +--+--+
| | |
| | |
| | |
+-----+ |
解决方案
解决方案/解决方法
我通过直接使用 MessageProducer 使它工作:
MessageProducer messageProducer = session.createProducer(message.getJMSReplyTo());
messageProducer.send(createResponse(message, outgoingEntity, session));
session.commit();
messageProducer.close();
推荐阅读
- c - 如何在 C 中初始化结构数组?
- flutter - Flutter 本地通知 int id 参数
- mysql - 选择列表不在 Group By 子句中并包含非聚合列
- javascript - 我如何用 for() 编写
- google-apps-script - INDEX-MATCH 公式在 Google 表格中返回相同的值
- css - 如何画出类似梯形的卡片?
- huawei-mobile-services - HMS Map Kit - React Native Marker 问题
- git - 使用来自单个 git 存储库的功能标志管理多个代码库
- python-3.x - Python 3.8.5 FTPS 连接
- xamarin.forms - MapBox 是否支持 Xamarin.Forms (Android/IOS/UWP) 中的室内导航实现?