1

以下は、Spring JMS を使用するメッセージ リスナ コードです。MessageProducer は ClientAcknowledgeMode に設定されます。例外が発生した場合、メッセージは引き続きキューから移動され、ロールバックされます。以下のコードに何か問題がありますか?

public class EmailListener implements MessageListener,ExceptionListener{



    private EmailSend emailSend;



    @SuppressWarnings("unchecked")
    public void onMessage(Message message){
        ObjectMessage om ;
        try {
            if(message instanceof ObjectMessage) {
                om = (ObjectMessage)message;
                emailSend.sendEmail((Map<String, String>)om.getObject());
                //throw new JMSException("Test");
                 om.acknowledge();

            }
        }
        catch(MailException me) {
            logger.error("Mail server exception in sending email",me);
            throw new RuntimeException(me);
        }catch(JMSException jmse) {
            logger.error("Error in sending email",jmse);
            throw new RuntimeException(jmse);

        }

    }

    public void setEmailSend(EmailSend emailSend){
        this.emailSend = emailSend;
    }

    public void onException(JMSException jmse){
        logger.error("Exception in sending email",jmse);

    }
    public void acknowledge(
    ) throws JMSException{

    }
}

以下はSpring構成です

<!--Spring JMS Message Listener Container -->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer"
        p:autoStartup="true" p:destination-ref="queue"
        p:destinationResolver-ref="jmsDestinationResolver"
        p:connectionFactory-ref="authenticationConnectionFactory"
        p:exceptionListener-ref="emailListener"
        p:messageListener-ref="emailListener" />
4

1 に答える 1

0

少し明確にする必要があります。見出しは、メッセージがキューにロールバックされないことを示していますが、投稿のテキストは、メッセージがロールバックされていることを示しています。

それでもなお、ロールバック動作を正しくするためのいくつかの指針は次のとおりです。

謝辞に頼らないでください。実際には、これらはアプリケーションロジックレベルの再配信を目的としたものではありません。あなたはそれについてのいくつかの詳細をここで読むことができます。したがって、ackは例外で再配信を取得しませんが、トランザクションは取得します。

DMLCでp:sessionTransacted="true"を設定できます。それはおそらくあなたが望むものでしょう-例外が発生した場合、メッセージはキューにロールバックされます。

これにデータベース接続を含め始めた場合、セッショントランザクションは1つのリソーストランザクションしかサポートしないため、代わりにWebLogic JNDIリポジトリからJtaトランザクションマネージャーを取得し、DMLCに適切にp:transactionManagerとして挿入する必要があります。

于 2012-10-03T22:47:10.167 に答える