2012-10-31 4 views
4

Spring과 HornetQ를 사용하여 JMS 트랜잭션을 관리하려고합니다. 내가 읽기에 싶지 블록을하기 때문에Spring에서 JMS 트랜잭션 관리

public void receive() { 
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); 
    Message msg = jmsTemplate.receive(queue); 
    boolean success = false; 
    if (msg != null) { 
      try { 
       success = handleMessage(msg); 
       if (success) { 
        msg.acknowledge(); // session is still open within the transaction 
       } 
      } catch (JMSException e) { 
       transactionManager.rollback(status); 
      } 
      if (success) 
       transactionManager.commit(status); 
      else 
       transactionManager.rollback(status): 
    } 
} 

내가 대기열에서 동기 읽기를하고있어, 0으로 설정 시간 제한 :
이 내가 쓴 코드입니다. 이 때문에 뭔가 실제로 받았는지 확인해야합니다.

applicationContext.xml의 발췌 한 것입니다 :

<bean id="inVMConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:/ConnectionFactory</value> 
    </property> 
</bean> 

<bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="inVMConnectionFactory" /> 
</bean> 

<bean id="producer" class="it.ubiquity.gestoreprofilazione.onweb.OnWebProducer" scope="singleton"> 
    <property name="queue" ref="retryQueue" /> 
    <property name="connectionFactory" ref="cachedConnectionFactory" /> 
</bean> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="cachedConnectionFactory" /> 
    <property name="sessionTransacted" value="true" /> 
    <property name="sessionAcknowledgeMode" value="#{T(javax.jms.Session).CLIENT_ACKNOWLEDGE}" /> 
    <property name="pubSubDomain" value="false" /> 
    <property name="receiveTimeout" value="# {T(org.springframework.jms.core.JmsTemplate).RECEIVE_TIMEOUT_NO_WAIT}" /> 
</bean> 

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> 
    <property name="connectionFactory" ref="cachedConnectionFactory" /> 
</bean> 

<bean id="consumer" class="it.ubiquity.gestoreprofilazione.onweb.OnWebConsumer" scope="singleton"> 
    <property name="queue" ref="retryQueue" /> 
    <property name="jmsTemplate" ref="jmsTemplate" /> 
    <property name="transactionManager" ref="jmsTransactionManager" /> 
</bean> 

내가 가진 문제는 매우 이상하다 : 나는 메시지, handleMessage 실패를받을 처음으로, 내가 트랜잭션을 롤백. 그러면 더 이상 아무것도 일어나지 않습니다. JMX 콘솔에서 확인하면 대기열에 하나의 메시지가 있음을 알 수 있습니다. 이제 JBoss를 다시 시작하면 예상대로 메시지가 반복해서 수신됩니다.
구성에 문제가있을 수 있지만 재부팅 후 작동하는 이유는 무엇입니까?

  • HornetQ 2.2.10
  • 보스 5.1.0
  • 봄 3.1.2

디버깅
내가 처음 볼을 사용 UPDATE :

을 DEBUG [org.springframework.jms.connection.JmsTransactionManager],515,(baseScheduler-1) 이름으로 새 트랜잭션을 생성 [널 (null)] : PROPAGATION_REQUIRED,

및 제 롤백 후 ISOLATION_DEFAULT, 이후에 받아 내가 볼 롤백 : [org.springframework

DEBUG를 .jms.connection.JmsTransactionManager] (baseScheduler-1) 보스를 다시 시작한 후,

대신 기존 트랜잭션에 참여, 나는 트랜잭션이 실제로 바 압연 것을 읽기 CK :

DEBUG [org.springframework.jms.connection.JmsTransactionManager] (baseScheduler-1) 초기화 트랜잭션 롤백 2012년 11월 5일 09 : 54 : 14,436 DEBUG [org.springframework.jms.connection .JmsTransactionManager] 롤백이가 처음 발생하지 왜 은 (baseScheduler-1), 그래서

세션

에 JMS 트랜잭션 롤백, 그리고 곧 나는 모든 시간을 어떻게 서버를 다시 시작? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

4

좋아, 마침내 나는 내 실수를 이해할 수 있었다 :) 바깥 쪽에서 나는 을 가져야한다. 거래는이다. 이것이 JBoss를 재시작 한 후에 메커니즘이 작동하는 이유입니다. 트랜잭션이 멈추지 않습니다.