gpt4 book ai didi

jms - 仅在 JPA 事务提交后才发送 JMS 消息

转载 作者:行者123 更新时间:2023-12-04 16:01:05 25 4
gpt4 key购买 nike

我正在开发一个使用 Spring 的 JmsTemplate、ActiveMQ 和 Hibernate 的项目。我有一个包装在事务中的方法,它通过 JmsTemplate 发送消息,做更多的工作然后返回,以便事务可以提交。我希望消息仅在事务提交后发送,即 JmsListener 应仅在上述方法返回后触发。

以发送方和接收方为例:

@Service
@Transactional
public class TestService{

@Autowired
private JmsTemplate jmsTemplate;

public void test() throws InterruptedException {
jmsTemplate.convertAndSend("test_queue", "Test");
Thread.sleep(1000L);
System.out.println("This should run first");
}
}

@Service
@Transactional
public class Listener {

@JmsListener(destination = "test_queue", containerFactory = "jmsListenerContainerFactory")
public void onMessage() {
System.out.println("This should run last.");
}
}

我希望文本“This should run first”在“This should run last”之前打印出来,但是由于 Thread.sleep 它永远不会!我尝试对我的 jmsListenerContainerFactory 上的配置进行一些更改,但没有任何区别。

不确定这种情况下是否涉及 XA。消息的实际发送是单独事务的一部分吗?如果是这样,问题可能是两个事务不同步,但我不知道如何解决。

最佳答案

我必须在 JmsTemplate 而不是 JmsListenerContainerFactory 上设置 Session Transacted:

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setSessionTransacted(true);
return jmsTemplate;
}

关于jms - 仅在 JPA 事务提交后才发送 JMS 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com