2016-09-20 2 views
3

현재 Jboss에서 애플리케이션을 실행 중입니다. 내 응용 프로그램은 ActiveMQ에서 JMS 메시지를 사용해야합니다 (내 ActiveMQ는 Jboss 모듈입니다.이 절차를 수행했습니다 : https://developer.jboss.org/wiki/IntegrationOfJBossAS7WithActiveMQ).MessageDrivenBean이 JMS 메시지를 두 번 소비 함

@MessageDriven(activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "Mongo-DB")}) 
public class MongoConsumer implements MessageListener { 

@Override 
public void onMessage(Message message) { 
    TextMessage textMessage = (TextMessage) message; 

    try { 
     json = textMessage.getText(); 
     collectionId = JsonUtils.extract(json, "_collectionId"); 
     uuid = JsonUtils.extract(json, "_uuid"); 

     queriesMongoDB.save(collectionId, json); 
     LOGGER.info("Insert in mongo : {}", uuid); 
    } catch (TechnicalException e) { 
     LOGGER.error("Something went wrong while calling Mongo : {}", e); 
     this.rollbackMdb(json); 
    } catch (JMSException e) { 
     LOGGER.error("Something went wrong with the Mongo Consumer", e); 
    } 

} 
} 
내 세션이 현재에서 시작

자동 수신 확인 모드 :

connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

해당 링크를 볼 수 있듯이

, 내 큐에 메시지를 사용하기 위해 MessageDrivenBean를 사용 몇 가지 메시지를 사용하여이 모든 작업을 진행하고 있습니다. 그러나 애플리케이션을 벤치마킹하고 많은 메시지를 보낼 때 MDB는 같은 메시지를 두 번 소비하고 MongoDB에 두 번 저장합니다.

많은 메시지 (예 : 200k)가있을 때만 문제가 발생합니다. 10 개 정도의 중복이 있습니다.

메시지를 처리하기 위해 스레드가 메시지를 처리하는 중이고 다른 스레드는 똑같은 작업을 수행하고있는 것으로 보입니다.

는 또한 CLIENT_ACKNOWLEDGE 모드에서, 내 JMS 세션의 유형을 변경하고, 추가 :

message.acknowledge(); 

을 내 방식의 beggining에서,하지만 도움이되지 않았다.

추신 : 나쁜 영어로 죄송합니다.

편집 : 난 그냥 버그를 재현하고 server.log에를 읽고 나는 중복에 대한 이러한 유형의 오류 가지고

:

16:41:35,376 WARN [org.apache.activemq.TransactionContext] (default-threads - 39) commit of: XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:f 
fff0a48263f:-669b4574:57e296f4:23fc96] failed with: javax.jms.JMSException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:ffff0a 
48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4: javax.jms.JMSException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23f 
c95,branchId=0:ffff0a48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4 
     at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1420) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.TransactionContext.syncSendPacketWithInterruptionHandling(TransactionContext.java:761) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.TransactionContext.commit(TransactionContext.java:562) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.ra.LocalAndXATransaction.commit(LocalAndXATransaction.java:92) 
     at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelOnePhaseCommit(XAResourceRecord.java:682) 
     at com.arjuna.ats.arjuna.coordinator.BasicAction.onePhaseCommit(BasicAction.java:2278) 
     at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1479) 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:98) 
     at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1189) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126) 
     at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75) 
     at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.afterDelivery(MessageEndpointInvocationHandler.java:72) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source) [:1.8.0_66] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_66] 
     at java.lang.reflect.Method.invoke(Method.java:497) [rt.jar:1.8.0_66] 
     at org.jboss.as.ejb3.inflow.AbstractInvocationHandler.handle(AbstractInvocationHandler.java:60) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.doInvoke(MessageEndpointInvocationHandler.java:136) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at org.jboss.as.ejb3.inflow.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:73) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at com.sun.proxy.$Proxy94.afterDelivery(Unknown Source) 
     at org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:128) 
     at org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:69) 
     at org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:225) 
     at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:1016) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:169) 
     at org.jboss.jca.core.workmanager.WorkWrapper.run(WorkWrapper.java:215) 
     at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33) 
     at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808) 
     at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45) 
     at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:849) 
     at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_66] 
     at org.jboss.threads.JBossThread.run(JBossThread.java:122) 
Caused by: javax.transaction.xa.XAException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:ffff0a48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4 
     at org.apache.activemq.transaction.XATransaction.newXAException(XATransaction.java:174) 
     at org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:368) 
     at org.apache.activemq.broker.TransactionBroker.commitTransaction(TransactionBroker.java:252) 
     at org.apache.activemq.broker.MutableBrokerFilter.commitTransaction(MutableBrokerFilter.java:117) 
     at org.apache.activemq.broker.TransportConnection.processCommitTransactionOnePhase(TransportConnection.java:498) 
     at org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:100) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:334) 
     at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:188) 
     at org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:116) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:248) 
     at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) [activemq-client-5.10.0.jar:5.10.0] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_66] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_66] 
     at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_66] 

16:41:35,410 WARN [com.arjuna.ats.jta] (default-threads - 39) ARJUNA016039: onePhaseCommit on < formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a48263f:-669b4574:57e296f4:23fc95, node_name=1, branch_uid=0:ffff0a48263f:-669b4574:57e296f4:23fc96, subordinatenodename=null, eis_name=unknown eis name > ([[email protected],TransactionContext{transactionId=null,connection=ActiveMQConnection {id=ID:tsfla902v-34440-1474467574382-7:1,clientId=ID:tsfla902v-34440-1474467574382-6:1,started=true}}]) failed with exception XAException.XAER_NOTA: javax.transaction.xa.XAException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:ffff0a48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4 
     at org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:786) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.TransactionContext.commit(TransactionContext.java:595) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.ra.LocalAndXATransaction.commit(LocalAndXATransaction.java:92) 
     at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelOnePhaseCommit(XAResourceRecord.java:682) 
     at com.arjuna.ats.arjuna.coordinator.BasicAction.onePhaseCommit(BasicAction.java:2278) 
     at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1479) 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:98) 
     at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1189) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126) 
     at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75) 
     at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.afterDelivery(MessageEndpointInvocationHandler.java:72) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source) [:1.8.0_66] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_66] 
     at java.lang.reflect.Method.invoke(Method.java:497) [rt.jar:1.8.0_66] 
     at org.jboss.as.ejb3.inflow.AbstractInvocationHandler.handle(AbstractInvocationHandler.java:60) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.doInvoke(MessageEndpointInvocationHandler.java:136) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at org.jboss.as.ejb3.inflow.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:73) [jboss-as-ejb3.jar:7.5.7.Final-redhat-3] 
     at com.sun.proxy.$Proxy94.afterDelivery(Unknown Source) 
     at org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:128) 
     at org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:69) 
     at org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:225) 
     at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:1016) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:169) 
     at org.jboss.jca.core.workmanager.WorkWrapper.run(WorkWrapper.java:215) 
     at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33) 
     at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808) 
     at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45) 
     at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:849) 
     at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_66] 
     at org.jboss.threads.JBossThread.run(JBossThread.java:122) 
Caused by: javax.transaction.xa.XAException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:ffff0a48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4 
     at org.apache.activemq.transaction.XATransaction.newXAException(XATransaction.java:174) 
     at org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:368) 
     at org.apache.activemq.broker.TransactionBroker.commitTransaction(TransactionBroker.java:252) 
     at org.apache.activemq.broker.MutableBrokerFilter.commitTransaction(MutableBrokerFilter.java:117) 
     at org.apache.activemq.broker.TransportConnection.processCommitTransactionOnePhase(TransportConnection.java:498) 
     at org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:100) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:334) 
     at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:188) 
     at org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:116) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:248) 
     at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133) [activemq-client-5.10.0.jar:5.10.0] 
     at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) [activemq-client-5.10.0.jar:5.10.0] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_66] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_66] 
     at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_66] 

16:41:35,418 WARN [com.arjuna.ats.arjuna] (default-threads - 39) ARJUNA012084: One-phase commit of action 0:ffff0a48263f:-669b4574:57e296f4:23fc95 received heuristic decision: TwoPhaseOutcome.HEURISTIC_HAZARD 

편집 2 :

을 누군가 여기 같은 문제가있는 것 같습니다 : https://issues.apache.org/jira/browse/AMQ-5953

내 ActiveMQ 모듈의 버전이 5.11이고 5.13 버전을 설치하려고 시도합니다. 작동하는지 확인하십시오. 나는 너희들을 새롭게 지킨다.

+0

메시지가 중복 된 것을 어떻게 알 수 있습니까? 실수로 동일한 JMSMessageID를 사용하고 프로듀서가 부주의하게 퍼블리시하지 않았습니까? –

+0

그것이 내 첫 번째 추측 이었지만, MDB가 소비 한 모든 메시지를 기록했으며, 동일한 JMSMessageId, 내부의 동일한 내용 등 ... 발생했을 때 정확히 동일한 메시지였습니다.ActiveMQ 스펙에서 큐에 동일한 JMSMessageId를 동시에 가질 수 없다는 것을 읽었습니다. 그래서 나는 내 소비자의 잘못이라고 확신한다. – PurplePanda

+0

.rollbackMdb의 기능은 무엇입니까? 아마도 SESSION_TRANSACTED를 사용하여 살펴볼 수있는 catch 블록 {} 모두에 있어야하므로 try {}에서 롤백하고 모든 catch에서 롤백 할 수 있습니다 { –

답변

2

드디어 해결책을 찾았습니다! 내 원래 게시물의 편집에서 설명하기 때문에 문제는 내 코드가 이벤트를 처리하는 동안 파괴되는 XATransaction과 관련이있는 것처럼 보입니다. 트랜잭션이 큐에 다시 만들어지고 코드가 처리 중입니다.

나는 나의 server.log에이 스택을 얻고 있었다 : https://issues.apache.org/jira/browse/AMQ-5953 :

16:41:35,376 WARN [org.apache.activemq.TransactionContext] (default-threads - 39) commit of: XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:f 
fff0a48263f:-669b4574:57e296f4:23fc96] failed with: javax.jms.JMSException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23fc95,branchId=0:ffff0a 
48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4: javax.jms.JMSException: Transaction 'XID:[131077,globalId=0:ffff0a48263f:-669b4574:57e296f4:23f 
c95,branchId=0:ffff0a48263f:-669b4574:57e296f4:23fc96]' has not been started. xaErrorCode:-4 

그런 다음, 나는이를 발견했다. 내 JBoss 내부의 ActiveMQ 모듈은 5.11 버전이었고, 5.14를 설치했습니다. 지금부터는 더 이상 중복 된 문제가 없습니다.

+0

감사합니다 PurplePanda! 똑같은 문제가있어, 당신의 팁은 정말로 그것을 못 박았습니다. –

관련 문제