我正在设计JMS应用程序,它从队列接收消息并更新数据库中的列。我正在使用tomcat和消息监听器来监听消息(没有MDB,也没有Spring MDP')。我希望在案例异常处理和事务处理中实现最佳,可靠的设计,以便消息不会丢失。
我应该使用jms会话事务模式还是jdbc事务。 或者只是jdbc事务就足够了(没有jms会话提交或回滚),因为这是一个数据库表更新。
由于
答案 0 :(得分: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
可能在成功的数据库更新和确认之间关闭,因此您应确保正确处理重复的消息。
变体是使用交易会话:
final boolean transacted = true;
// 2nd parameter is ignored if the session is transacted
final QueueSession queueSession = queueConnection.createQueueSession(
transacted, -1);
在此模式下,您可以使用单个提交确认多条消息:
queueSession.commit();
如果多条消息导致单个数据库操作(您必须先收集一些消息,然后才能更新数据库),则需要此模式。