2014-06-19 6 views
1

WerbLogic 10.3.5 및 Spring 3.0을 사용하여 JMS 대기열을 구현하고 있습니다. 나는 다음과 같은 봄 구성이 :스프링/WebLogic - 실패시 다시 전달되지 않는 JMS 메시지

<!-- 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> 

내 메시지 생성 코드는 다음과 같습니다

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); 

을 그리고 내 청취자는 다음과 같습니다

@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); 
} 
} 

메시지가 제대로 작성되고, 내 리스너의 onMessage() 메소드가 호출되고 있지만 논리가 실패하고 RuntimeException()을 throw하면 메시지가 다시 전달되지 않습니다. 위의 코드 (예 : sessionAcknowledgeModeName = SESSION_TRANSACTED를 설정하고 트랜잭션을 명시 적으로 롤백)와 같은 많은 변형을 시도했지만 메시지는 결코 대기열에 다시 대기하지 않습니다. 실패한 메일을 재전송하는 트릭이란 무엇입니까?

+0

'DefaultMessageListenerContainer'에'sessionTransacted'를 "true"로 설정해 보셨습니까? –

+0

그게 전부 였어. 이 질문을 답으로 제공하면 받아 들일 것입니다. 감사! – freecouch

+0

:-) 멋지다, 지금 기쁘다. –

답변

2

나는 당신이 DefaultMessageListenerContainer에 대한 truesessionTransacted을 설정해야합니다 믿습니다

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

당신은 here 관련 참조 문서를 찾을 수 있습니다.