我正在设计从队列接收消息并更新数据库中的列的JMS应用程序。我正在使用tomcat和消息侦听器来侦听消息(没有MDB,也没有Spring MDP's)。我希望在异常处理和事务处理中尽可能提供强大的设计,以便消息不会丢失。带有异常处理的JMS事务
我应该使用jms会话事务模式和jdbc事务。 或者只是jdbc事务已经足够(没有jms会话提交或回滚),因为这是数据库表更新。
感谢
我正在设计从队列接收消息并更新数据库中的列的JMS应用程序。我正在使用tomcat和消息侦听器来侦听消息(没有MDB,也没有Spring MDP's)。我希望在异常处理和事务处理中尽可能提供强大的设计,以便消息不会丢失。带有异常处理的JMS事务
我应该使用jms会话事务模式和jdbc事务。 或者只是jdbc事务已经足够(没有jms会话提交或回滚),因为这是数据库表更新。
感谢
一个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();
你需要这个模式,如果多个消息导致单个数据库操作(在更新数据库之前,您必须收集一些消息)。