2013-05-21 74 views
3

在JMS文档中,我读到消息驱动Bean不支持CLIENT_ACKNOWLEDGE模式,仅支持DUPS_OK_ACKNOWLEDGEAUTO_ACKNOWLEDGE如何确认消息驱动Bean中的消息

据我所知,在AUTO_ACKNOWLEDGE模式下,当onMessage方法被调用时,消息被确认(从目的地删除)。我想要的是告诉我的经纪人不要在发生故障时从目的地(队列或主题)删除消息

必须有一些方法可以做到这一点。无论如何,Message Drven Beans不支持CLIENT_ACKNOWLEDGE

+0

AUTO_ACKNOWLEDGE删除邮件* *后的onMessage调用成功 – Konstantin

回答

6

我想告诉我的经纪人在发生不良事件时不要从 目标(队列或主题)中删除消息。

如果你配置为使用PERSISTENT消息,在onMessage()任何异常将基于经纪人和目的地设置持续的重新传递消息。如果您使用NON_PERSISTENT消息,则onMessage()中的任何异常通常会丢弃该消息。

无论如何,为什么消息驱动Bean不支持CLIENT_ACKNOWLEDGE。

消息驱动bean由J2EE容器管理;同样,容器处理确认。通常,只有独立的JMS接收器应该使用CLIENT_ACKNOWLEDGE

你正在使用什么消息传递中间件?

+0

这正是我今天发现研究的信息。 :)但是,无论如何,谢谢!我在Glassfish服务器上使用OpenMQ。 –

+0

“onMessage()中的任何异常都会使消息重新传递” - 我应该在onMessage中引发异常吗?但是我不能因为onMessage方法被实现而且它不会抛出异常。 –

+0

@NoorSyed这是一个问题,因为一旦'onMessage()'成功完成,它就会被使用。 – raffian

0

只要确保您使用的是(JTA)交易(默认是您正在使用它们)。然后确保您的应用程序服务器具有重新传输设置和/或死信队列(DLQ)。从您的MDB抛出的任何异常都会触发重新传送,并且在发生一定程度的故障后,该消息将被移至DLQ。

的redeilvery设置被称为“最大的递送,企图”在Wildfly例如