2012-10-02 5 views
1

weblogic10.3.4 및 JMS 대기열이 메시지 수신자 코드이며 Spring JMS를 사용합니다. MessageProducer는 ClientAcknowledgeMode로 설정됩니다. 예외가 발생하면 메시지는 여전히 대기열 밖으로 이동하고 롤백을 반환합니다. 아래 코드는 잘못된 것입니까?weblogic JMS 대기열 메시지가 롤백되지 않는 예외

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 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" /> 

답변

0

입니다. 제목은 메시지가 대기열로 롤백되지 않는 반면 게시물의 텍스트는 메시지가 롤백됨을 나타냅니다.

이 승인에 의존하지 마십시오

결코 적은 몇 포인터는 다시 올바른 행동을하여 롤을 얻을 수 있습니다. 사실, 응용 프로그램 논리 수준의 재 전달이 의도되지 않습니다. 그것에 대한 세부 정보는 here에서 읽을 수 있습니다. 그래서, acks는 예외적으로 재 배달을하지는 않지만 거래가 이루어집니다.

DMLC에서 p : sessionTransacted = "true"로 설정할 수 있습니다. 아마도 원하는 것일 것입니다. 예외가 발생하면 메시지가 대기열로 롤백됩니다.

데이터베이스 연결을 포함하기 시작하면 세션 트랜잭션이 하나의 자원 트랜잭션 만 지원하므로 WebLogic JNDI 저장소에서 Jta 트랜잭션 관리자를 가져 와서 DMLC에 p : transactionManager propery로 주입해야합니다.

관련 문제