2012-09-14 63 views
0

假定一些弹簧bean有事务方法和它做两两件事:事务和异步处理

  • 异步发送JMS消息
  • 更新DB

的问题是,当消息被消耗,DB事务有时不提交,并且处理程序无法在DB期望值中找到。

明显的解决方案是发送事务,但是我使用ActiveMQ上的异步发送来提高吞吐量。如果我发送交易,我会放弃异步,也有可能获得OuOfMemory。

你会如何解决这个问题?

回答

2

您需要使用支持XA的事务管理器,并发送JMS消息并在同一分布式事务中对数据库执行更新。

这不会改变任何异步:发送呼叫将在接收者收到消息之前返回。但是当它收到它时,事务将被提交,接收者将在数据库中找到更新。

我没有看到OutOfMemoryErrors与此有什么关系。

+0

我认为消息不会发送给代理,直到在这种情况下提交事务,所以我害怕由于许多等待消息而丢失吞吐量和OOM,但它看起来我错了,您的建议将解决问题。 –

+0

发送消息时,消息将发送给代理(就像在执行时将JDBC语句发送到数据库一样)。但是,在事务提交之前,代理不会将其发送给接收者(就像事务提交时JDBC语句实际上永久保存一样)。 –