简体   繁体   English

Spring / WebLogic-失败时未重新发送JMS消息

[英]Spring / WebLogic - JMS message not redelivered on failure

I am using WerbLogic 10.3.5 and Spring 3.0 to implement a JMS queue. 我正在使用WerbLogic 10.3.5和Spring 3.0来实现JMS队列。 I have the following Spring configuration: 我有以下Spring配置:

    <!--  JMS Configuration -->
<bean id="paymentlistener" class="com.myproject.service.impl.PaymentListener"/> 

<bean id="paymentlistenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="concurrentConsumers" value="10"/>
    <property name="connectionFactory" ref="paymentConnectionFactory"/>
    <property name="destination" ref="paymentQueue"/>
    <property name="messageListener" ref="paymentlistener"/>
</bean>

<bean id="paymentQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jms/paymentResponseHandlerQueue"/>
    <property name="jndiTemplate" ref="jndiTemplate"/>
</bean>

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
            <prop key="java.naming.provider.url">t3://localhost:7001</prop>
        </props>
    </property>
</bean>

<bean id="paymentConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="jms/paymentResponseHandlerConnectionFactory"/>
</bean>

<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="cache" value="true"/>
</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="paymentConnectionFactory"/>
    <property name="destinationResolver" ref="jmsDestinationResolver"/>
    <property name="defaultDestination" ref="paymentQueue"/>
    <property name="sessionAcknowledgeModeName" value="DUPS_OK_ACKNOWLEDGE"/>
    <property name="sessionTransacted" value="true"/>
</bean>

My message creation code looks like this: 我的消息创建代码如下所示:

    MessageCreator messageCreator = new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
                logger.debug("Session ack mode: " + session.getAcknowledgeMode());
                return session.createObjectMessage(payment);
        }
    };


    jmsTemplate.send("jms/paymentResponseHandlerQueue", messageCreator);

And my listener looks like this: 我的听众看起来像这样:

@Override
public void onMessage(Message message) { // , Session session
if (!(message instanceof ObjectMessage)) {
    throw new IllegalStateException("The PaymentListener queue expects an object message"); 
}

ObjectMessage objectMessage = (ObjectMessage) message;

try {
    logger.debug("Is Message redelivered:" + objectMessage.getJMSRedelivered ());

    if (objectMessage.getObject() instanceof CreditCardPaymentDTO) {

        logger.debug("Object is of type CreditCardPaymentDTO");

        // The user that just logged in
        CreditCardPaymentDTO payment  = (CreditCardPaymentDTO) objectMessage.getObject();               
        otpCollectorDAO.savePayment(payment);
    }
} catch (JMSException e) {
    logger.error(e);
    throw new RuntimeException(e);
} catch (PaymentResponseException e) {
    logger.error(e);
    throw new RuntimeException(e);
}
}

The message is being created correctly, and the onMessage() method of my listener is being called, but if the logic fails and I throw a RuntimeException(), the message does not get redelivered. 正在正确创建消息,并正在调用侦听器的onMessage()方法,但是如果逻辑失败并且抛出RuntimeException(),则消息不会重新传递。 I've tried many slight variations of the above code (eg. setting sessionAcknowledgeModeName=SESSION_TRANSACTED and explicitly rolling back the transaction), but the message is never re-queued. 我已经尝试了上述代码的许多细微变化(例如,设置sessionAcknowledgeModeName = SESSION_TRANSACTED并显式回滚事务),但是消息从未重新排队。 What is the trick to getting failed messages to redeliver? 使失败的邮件重新传递的诀窍是什么?

I believe you need to set sessionTransacted to true for the DefaultMessageListenerContainer : 我相信您需要将DefaultMessageListenerContainer sessionTransacted设置为true

<bean id="paymentlistenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    ...
    <property name="sessionTransacted" value="true"/>
</bean>

You can find here relevant reference documentation. 您可以在此处找到相关的参考文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM