处理从jms生成器收到的消息时崩溃

时间:2015-07-22 19:12:13

标签: jms ejb-3.1

如果jms mdb使用者在处理从jms生成器收到的消息时崩溃会发生什么?恢复时能否再次使用该消息? 它取决于消费者认可模式吗?或mdb上的aon事务定义?或其他事情?

1 个答案:

答案 0 :(得分:0)

实际上取决于很多事情。不同的JMS实现具有不同的行为。

关键是不应丢失持久性消息。所以他们应该可以重新运行。因此,MDB中未捕获的异常将回滚持久性消息。请注意,这可能会导致一些名为"有害信息"。想象一下,在MDB中导致NullPointerException的非常具体的消息。

该消息将回滚到队列,然后再次处理,然后回滚等等。一切都很快。在许多会使日志泛滥的设置中,会占用大量资源并停止处理要传递的消息。为了解决这个问题,大多数/所有JMS实现都有一个概念死信队列(或撤销队列),在一定次数的重试之后会损坏消息,以进行手动检查。具体如何工作和配置是特定于实现的。

一种常见的最佳做法"使用MDB只是对瞬态错误进行回滚。即如果数据库无法访问,或者HTTP资源不可用 - 那么重试是有意义的。如果你遇到其他一些错误,比如NullPointerException或弄清楚你无法解析传入的消息 - 最好抓住异常并尽可能好地关闭处理(具有良好的loggning,错误消息和等等)。这是因为它可能是发送方或接收方的错误。