2013-07-11 63 views
1

我正在设计从队列接收消息并更新数据库中的列的JMS应用程序。我正在使用tomcat和消息侦听器来侦听消息(没有MDB,也没有Spring MDP's)。我希望在异常处理和事务处理中尽可能提供强大的设计,以便消息不会丢失。带有异常处理的JMS事务

我应该使用jms会话事务模式和jdbc事务。 或者只是jdbc事务已经足够(没有jms会话提交或回滚),因为这是数据库表更新。

感谢

回答

1

一个JDBC事务是不够的:如果你读过的消息,并且对数据库的操作失败,并且tomcat被关闭,该消息被丢失。


如果每个消息触发在数据库中插入/更新,你可以使用CLIENT_ACKNOWLEDGE模式:

final boolean transacted = false; 
    final int ackMode = Session.CLIENT_ACKNOWLEDGE; 
    final QueueSession queueSession = queueConnection.createQueueSession(
      transacted, ackMode); 

所以,你可以阅读该邮件,并更新数据库。如果数据库升级成功,您可以使用确认

message.acknowledge(); 

没有acknowledge消息,该消息将被重新传递:所以重新启动后tomcat,你的消息监听器应该再次看到该消息。您可以使用queueSession.recover()以编程方式重新开始交付。

因为它有可能tomcat关机成功DB更新和确认之间的权利,你应该确保正确处理重复的消息。


的变化是使用事务处理会话:

final boolean transacted = true; 
    // 2nd parameter is ignored if the session is transacted 
    final QueueSession queueSession = queueConnection.createQueueSession(
      transacted, -1); 

在这种模式下,你可以使用一个确认多个邮件提交:

 queueSession.commit(); 

你需要这个模式,如果多个消息导致单个数据库操作(在更新数据库之前,您必须收集一些消息)。