示例 2:系统资源不可用时自动停止 MDB
要为系统资源不可用的情况做好准备,请将系统配置为少量消息失败后即自动停止消息驱动的 Bean (MDB) 并向您报告该问题。
开始之前
MDB 侦听的目标必须是异常目标。此异常目标可以是系统缺省值,也可是专门为该目标配置的值。
要完成此任务,您需要以下信息:
- 包含 MDB 的企业应用程序。
- 相关外部系统资源。
- 连续失败消息阈值的值为 3。这是最大消息传送连续失败数,在此之后 MDB 会停止。此属性适用于消息集。
- 失败消息重试之间的延迟的值设置为 5000,即,可将失败消息传送至 MDB 之前的时间(以毫秒计)。除非连续失败消息阈值和最大并行度设置为 1,否则在此时间段内可能会传送其他消息。
- 每个消息的最大失败传递次数的值为 5,即,尝试处理消息的最大失败次数,在此之后消息将从其期望目标转发至异常目标。此属性适用于个别消息。
关于此任务
在此方案中,企业应用程序或业务级应用程序是持续运行的系统,此系统使用已部署 MDB 来访问外部系统资源。
如果外部资源遇到问题并且变为不可用,那么所部署 MDB 无法访问该资源,所以与该 MDB 相关联的事务会回滚,并且消息 msg1 被放回到队列上。
消息 msg1 会隐藏 5 秒(重试延迟,在失败消息重试之间的延迟中设置),然后可供 MDB 使用。
同时,MDB 会处理队列上的下一个消息(即 msg2)。外部资源仍然不可用,所以此消息的处理也会失败。该消息事务回滚并隐藏 5 秒。队列上的下一条消息(即 msg3)的处理失败并且也会隐藏。
隐藏的消息数达到连续失败消息阈值时,MDB 将不会处理其他任何消息,直到其中一个隐藏消息重新变为可用。
msg1 的失败消息重试之间的延迟到期时,会显示 msg1 并对其进行重新处理。因为资源仍然不可用,所以消息再次隐藏。对于 msg2 和 msg3,情况也是如此。
消息回滚的次数比每个消息的最大失败传递次数限制(在此方案中为 5 次)少 1 时,消息会被视为失败消息。所以,msg1 第 4 次显示,回滚并再次隐藏后,连续失败计数会递增。此时 msg2 会出现,回滚并再次隐藏。同样,msg3 会出现,回滚并再次隐藏。连续失败计数达到连续失败消息阈值并且 MDB 自动停止。JCA MBean 会发出 JMX 通知,并且日志条目会向系统管理员发出 MDB 已停止的警报。
注: 在此方案中,系统资源不可用的时间达到大约
20 秒后,MDB 会自动停止。如果系统资源有一小段时间不可用,并且连续失败计数达不到连续失败消息阈值,那么某次重试后消息会成功得到处理。实际上,系统通常会在没有手动干预的情况下继续运行,并且不向异常目标发送任何消息。