簡體   English   中英

MessageDriverBean - 重試機制

[英]MessageDriverBean - Retry mechanism

我一直在閱讀 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(); 在每次捕獲時將消息放回?

我是否必須在每次捕獲時調用 context.setRollbackOnly() 才能將消息放回?

這取決於我們,如果您想回滾所有異常的消息,是的。 如果是壞消息/有毒消息,則沒有回滾事務的意義,最好通過記錄異常和消息的有效負載來丟棄。

對於您的第一次查詢,如果 onMessage 出現異常會將該消息放回 Queue,請查看以下幾點:

由於以下原因,JMS 服務器可以重新傳遞消息:

接收器/MDB 的 onMessage 方法拋出了 java.lang.Error 或 java.lang.RuntimeException

用戶在其 MDB 的 onMessage 方法中調用了 ejbcontext.setRollbackOnly()(這僅適用於容器管理事務)

由於某種原因,參與事務的 MDB 失敗。

以下帖子非常好,您可以參考它以獲取更多詳細信息:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM