JMS와 관련된 문제점과 완전히 이해하지 못한 트랜잭션이 있습니다. 내 응용 프로그램에는 하나의 JDBC 자원과 두 개의 JMS 대기열이 있습니다. 대기열의 메시지 생성자는 동일한 jms 세션 객체의 동일한 stateless 세션 bean에서 작성됩니다. 대기열을 사용하는 방법은 다음과 같습니다. entitiy가 작성되고 해당 id가 JMS 메시지의 특성으로 저장되어 대기열로 보내집니다. 엔티티 생성과 대기열에 대한 제출은 동일한 트랜잭션에서 발생합니다. 내 메시지 구동 Bean은 JMS 메시지의 ID를 통해 데이터베이스에서 엔티티를 검색하고 처리합니다.JMS 트랜잭션 문제
이 코드는 다음과 거의 같습니다
엔티티가의 onMessage() 메소드의 데이터베이스에서 검색public void onMessage(Message message) {
Long id;
try {
id = message.getLongProperty("id");
} catch (Exception ex) {
Logger.getLogger(AlertMessageListener.class.getName()).log(Level.SEVERE, null, ex);
throw new EJBException(ex);
}
SomeObject obj = entityManager.find(SomeObject.class, id);
obj.process();
}
, 다음과 같은 예외가있는 다음 MDB의 onMessage 메소드는
public long doSomething(String message) {
SomeObject obj = new SomeObject(message);
entityManager.persist(obj)
// submit to JMS queue
try {
Message jmsMessage = session.createMessage();
jmsMessage.setLongProperty("id", obj.getId());
messageProducer.send(jmsMessage);
} catch (JMSException ex) {
Logger.getLogger(NotificationQueue.class.getName()).log(Level.SEVERE, null, ex);
}
return obj.getId();
}
로그 파일 :
FINE: ENTRY com.test.app.alert.control.AlertMessageListener onMessage
FINE: ENTRY com.test.app.alert.control.MessageDao find
FINER: client acquired: 2104888816
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 1368213481
FINEST: Execute query ReadObjectQuery(name="readObject" referenceClass=Message sql="SELECT ID, DTYPE, MESSAGE, REPORTTIME, SENDER_USERNAME, ALERTSTATE, TIMERHANDLE, CATEGORY_ID, PRIORITY_PRIOLEVEL FROM MESSAGE WHERE (ID = ?)")
SEVERE: prepareTransaction (XA) on JMSService:jmsdirect failed for connectionId:7979865462417759232 due to Unknown JMSService server error ERROR: com.sun.messaging.jmq.jmsserver.util.BrokerException: Bad transaction state transition. Cannot perform operation PREPARE_TRANSACTION(56) (XAFlag=null) on a transaction in state STARTED(1).
WARNING: JTS5031: Exception [java.lang.RuntimeException: javax.transaction.xa.XAException] on Resource [prepare] operation.
SEVERE: rollbackTransaction (XA) on JMSService:jmsdirect failed for connectionId:7979865462417759232:transactionId=7979865462479908608 due to Unknown JMSService server error ERROR: com.sun.messaging.jmq.jmsserver.util.BrokerException: Bad transaction state transition. Cannot perform operation ROLLBACK_TRANSACTION(48) (XAFlag=null) on a transaction in state STARTED(1).
WARNING: JTS5068: Unexpected error occurred in rollback
javax.transaction.xa.XAException
at com.sun.messaging.jms.ra.DirectXAResource.rollback(DirectXAResource.java:703)
at com.sun.jts.jta.TransactionState.rollback(TransactionState.java:193)
at com.sun.jts.jtsxa.OTSResourceImpl.rollback(OTSResourceImpl.java:333)
at com.sun.jts.CosTransactions.RegisteredResources.distributeRollback(RegisteredResources.java:1063)
at com.sun.jts.CosTransactions.TopCoordinator.rollback(TopCoordinator.java:2299)
at com.sun.jts.CosTransactions.CoordinatorTerm.commit(CoordinatorTerm.java:420)
at com.sun.jts.CosTransactions.TerminatorImpl.commit(TerminatorImpl.java:250)
at com.sun.jts.CosTransactions.CurrentImpl.commit(CurrentImpl.java:623)
at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:319)
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.commitDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:173)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:873)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5115)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4880)
at com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1207)
at com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1180)
at com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:86)
at com.sun.enterprise.connectors.inbound.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:143)
at $Proxy260.afterDelivery(Unknown Source)
at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:328)
at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:114)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:496)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:537)
Caused by: com.sun.messaging.jmq.jmsservice.JMSServiceException: rollbackTransaction: rollback transaction failed. Connection ID: 7979865462417759232, Transaction ID: 7979865462479908608, XID: null
at com.sun.messaging.jmq.jmsserver.service.imq.IMQDirectService.rollbackTransaction(IMQDirectService.java:1827)
at com.sun.messaging.jms.ra.DirectXAResource.rollback(DirectXAResource.java:672)
... 21 more
Caused by: com.sun.messaging.jmq.jmsserver.util.BrokerException: Bad transaction state transition. Cannot perform operation ROLLBACK_TRANSACTION(48) (XAFlag=null) on a transaction in state STARTED(1).
at com.sun.messaging.jmq.jmsserver.data.TransactionState.nextState(TransactionState.java:449)
at com.sun.messaging.jmq.jmsserver.data.handlers.TransactionHandler.preRollback(TransactionHandler.java:1586)
at com.sun.messaging.jmq.jmsserver.data.protocol.ProtocolImpl.rollbackTransaction(ProtocolImpl.java:777)
at com.sun.messaging.jmq.jmsserver.service.imq.IMQDirectService.rollbackTransaction(IMQDirectService.java:1816)
... 22 more
FINER: TX afterCompletion callback, status=ROLLEDBACK
FINER: release unit of work
FINER: client released
FINEST: Register the existing object [email protected]
FINER: end unit of work commit
FINEST: Register the existing object Mailserver
FINEST: Register the existing object Low
FINEST: Register the existing object u0 u0 (u0)
FINEST: Register the existing object Sankt Augustin
FINE: RETURN com.test.app.alert.control.MessageDao find
...
WARNING: javax.ejb.EJBException
javax.ejb.EJBException: Transaction aborted
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5121)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4880)
at com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1207)
at com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1180)
at com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:86)
at com.sun.enterprise.connectors.inbound.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:143)
at $Proxy260.afterDelivery(Unknown Source)
at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:328)
at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:114)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:496)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:537)
Caused by: javax.transaction.RollbackException
at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:321)
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.commitDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:173)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:873)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5115)
... 10 more
다음 로그 파일에 약간의 정보가 있습니다. 전자 (엔티티가 생성 된 후) :
INFO: DXAR:start():Warning:Received diff Xid for open txnId:switching transactionId:
DXAR Xid=(GlobalTransactionID=[[email protected], BranchQualifier=[[email protected])
DXAR TXid=7979865462479908608
got Xid=(GlobalTransactionID=[[email protected], BranchQualifier=[[email protected])
got TXid=7979865462480472064
정확히 예외는 무엇을 의미합니까 : 나는 JPA 2.0 (및 아파치 더비)와 글래스 피시 버전 3.1-B35를 사용하고있어
Bad transaction state transition. Cannot perform operation ROLLBACK_TRANSACTION(48) (XAFlag=null) on a transaction in state STARTED(1).
표준 JMS 공급자는 GF와 함께 제공됩니다. 트랜잭션 설정은 JMS 자원 (EMBEDDED 모드)뿐만 아니라 기본값입니다. 트랜잭션은 컨테이너 관리됩니다. 어떤 아이디어가 잘못 되었습니까? 예외는 꽤 자주 발생합니다.
링크가 작동하지 않습니다. – dazito