0

Weblogic サーバーの外部 JMS サーバーとして MQ を使用しています。問題は、メッセージをロールバックして、バックアウトのしきい値に達するまで再試行する必要があることです。次に、メッセージをバックアウト キューに移動する必要があります。

MessageDrivenContext.setRollbackOnly() メソッドがそれを適切に処理します。ただし、問題はバックアウト キューのメッセージにあります。メッセージはコミットされていません。

さらに、メッセージはバックアウト キューから取得され、新しいメッセージがメイン キューに表示されるとすぐに再度処理されます。

これは、私のアプローチに何かひどく問題があることを示唆しています。ただし、同じメッセージで onMessage() を数回再試行し、それをバックアウト キューに送信する必要があるという事実を変更することはできません。

@MessageDriven( name="MQListener", mappedName = "jms.mq.SOME.QUEUE.NAME",
        activationConfig = 
        { 
            @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms.mq.SOME.QUEUE.NAME"),
            @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms.mq.MQ"),
            @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true")
        }) 
public class MQListener implements MessageListener {
    @Resource
    private MessageDrivenContext context;

    @Override
    public void onMessage(Message message) {
        String messageContent="";

        try {
            messageId = message.getJMSMessageID();
            if (message != null) {
                messageContent = ((TextMessage)message).getText();
                if(!doSomething(messageContent)){
                    // doSomething fails, I need to rollback the message and try again:
                    context.setRollbackOnly();
                }
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }

    }

    private boolean doSomething(String messageContent){
        // ...
    }

}
4

1 に答える 1

1

私は EJB の専門家です。しかし、あなたのコード スニペットからわかるように、の初期化が欠落していると思いますMessageDrivenContext。どちらかにする必要があると思います

context = getMessageDrivenContext(); 
context.setRollbackOnly();

また

getMessageDrivenContext().setRollbackOnly();
于 2013-01-30T11:44:03.457 に答える