2016-04-11 89 views
0

我的项目中有JMS队列实现,我在其中一个事务中发送100个消息,但在将其放入队列之前执行一些数据库操作。即在发送JMS队列之前提交消息

//SuedoCode 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void sendMsg(List orders) 
{ 
    for(Order order : orders) 
    { 
    order.setStatus("SENT"); 
    sendToQueue(order); 
    } 

} 

但是这个交易仍然没有提交,并且接收方在提交发件人的交易之前拿起订单。现在,接收方处理消息并再次改变状态,然后提交,但在发送方事务提交之后,它覆盖不应该发生的状态。

因此,为了解决其具有方法来改变的顺序的状态这个问题我创建了一个新类(对于弹簧代理),并且此方法是在REQUIRES_NEW交易这样的状态已改变,但如果任何错误发生而发送消息再次排队然后状态需要改变(因为之前的事务已经提交)。 请给我建议如果这种方法是正确的或者可以做更好的事情。 在此先感谢

回答

0

排队的消息需要成为同一事务的一部分,以便所有内容都立即提交。

缺乏这一点,另一种解决方案是将更新的订单存储在列表中,并在您确认事务已提交且数据库已更新后立即在此方法外调用sendToQueue。