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 트랜잭션 롤백, 그리고 곧 나는 모든 시간을 어떻게 서버를 다시 시작? 내가 도대체 뭘 잘못하고있는 겁니까?