MessageDriverBean - 重试机制

时间:2015-09-24 17:22:46

标签: java java-ee jms message-driven-bean

我一直在阅读SO和其他一些谷歌搜索结果,我感到很困惑,有人说我要打电话给context.setRollbackOnly();其他人说这不是必需的,因为MDB会自己做。

所以,我有一个MessageDrivenBean课程,可以接收来自JMS Queue的消息。

@MessageDriven(name = "MyEventReceiverJMS", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/TheQueue"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
})
public class MyEventReceiverJMS implements MessageListener {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Resource
    private MessageDrivenContext context;


    @Override
    public void onMessage(Message message) {

        try {
            // Some logic goes here
        } 
        catch (JMSException ex) {
            logger.error("JMSException|could not retrieve object from the message body - reason: {}", ex.getMessage());
            context.setRollbackOnly();
        } 
        catch (JSONException ex) {
            logger.error("error while creating the JSON - reason: ", ex.getMessage());
            context.setRollbackOnly();
        } 
        catch (IOException ex) {
            logger.error("could not communicate with the server - reason: {}", ex.getMessage());
            context.setRollbackOnly();
        }
    }
}

我的问题是,如果onMessage上存在异常,message(或我称之为事件)会被MDB放回队列,还是我必须打电话每个捕获的context.setRollbackOnly();都要回复消息?

1 个答案:

答案 0 :(得分:2)

我是否必须在每个catch上调用context.setRollbackOnly()才能收回消息?

这取决于我们,如果你想回滚所有例外的消息,是的。 如果它是一个坏/有害的消息,没有回滚事务的意义,最好通过记录异常和消息的有效负载来丢弃。

对于您的第一个查询,如果onMessage上有异常,则会将消息放回到队列中,请找到以下几点:

  

由于以下原因,JMS服务器可以重新发送消息:

     

抛出了java.lang.Error或java.lang.RuntimeException   Receiver / MDB的onMessage方法

     

用户在他的MDB中调用了ejbcontext.setRollbackOnly()   onMessage方法(这仅适用于Container Managed Transaction)

     

参与交易的MDB因某种原因失败。

以下帖子非常好,您可以参考以获取更多详细信息:

http://weblogic-wonders.com/weblogic/2011/01/10/working-with-jms-and-the-standard-issues-in-jms/