当前位置: 首页 > 知识库问答 >
问题:

JBOSS WildFly:ARJUNA016082:不允许同步!向@PostPersist触发的JMS队列发送消息时

欧阳学真
2023-03-14

我有一个关于标题中的错误信息的问题。我正努力做到以下几点:

  • 通过EntityManager.Merge(...)插入实体;
  • @postPersist实体的侦听器应向JMS队列(HornetQ)发送消息,通知系统的其他部分插入了该实体。

使用@postpersist注释的方法被完美地调用,但是在发送消息时,我得到了下面的错误消息。看起来发送消息会触发错误,但为什么呢?

另一个奇怪的行为是,如果我第二次触发相同的操作,错误不会出现,消息会被发送到队列。

我正在使用以下环境:

  • JBoss Wildfly CR1
  • Hibernate4.3.0
  • JDK 1.7.0.25

感谢任何帮助。如果你需要任何进一步的信息,我会尽力提供。

编辑:

>

  • 我发现在调用EntityManager.Merge(...);之后发送消息不会出错。只有通过@postpersist触发消息时,才会发生错误。
  • 当使用以下代码创建对象消息(上下文是JMSContext对象(JMS2.0))时,准确地发生错误:

    context.createProducer().send(destination, context.createObjectMessage(aMessage));
    

    2nEdit:

    • EntityManager.Merge(...)之后调用EntityManager.Flush()是一种不会产生错误的解决方法。我可以这样做,但我想了解原因。

    完整的错误消息

    null

    原因:javax.transaction.rollbackException:ArJuna016053:无法提交事务。在com.arjuna.ats.internal.jta.transaction.arjunacore.transactionimple.commitandDisassociate(transactionimple.java:1178)在com.arjuna.ats.internal.jta.transaction.arjunacore.baseTransaction.commit(baseTransaction.java:126)在com.arjuna.ats.jbosatx.baseTransactionManagerDelegate.commit(baseTransaction.java:75)在

    原因:javax.persistence.persistenceexception:在org.hibernate.jpa.spi.abstractentyManagerimpl托管刷新期间出错$CallbackExceptionMapperImpl.MapManagedFlushFailure(abstractentyManagerimpl.java:1887)[hibernate-EntityManager-4.3.0.final.jar:4.3.0.final]在)com.arjuna.ats.arjuna.AtomicAction.Commit(AtomicAction.java:162)com.arjuna.ats.internal.jta.transaction.arjunaCore.TransactionImple.CommithandDisAssociated(TransactionImple.java:1166)...92更多

    null

    原因:java.lang.RuntimeException:java.lang.IllegalStateException:ArJuna016082:不允许同步!事务状态isActionStatus.org.jboss.as.messaging.deployment.jmsContextProducer$jmsContextRapper.getDelegate(jmsContextProducer.java:243)[wildfly-messaging-8.0.0.cr1.jar:8.0.0.cr1]在org.jboss.as.messaging.deployment.jmsContextProducer$jmsContextRapper.createProducer(jmsContextProducer.java:257)ceptorContext.Java:309)在org.jboss.invocation.weavedInterceptor.Java:53)在org.jboss.as.ee.component.interceptor.userInterceptorFactory$1。processInvocation(userInterceptorFactor.Java:63)在org.jboss.invocation.interceptorContext.proceed(interceptorContext.Java:309)在org.jboss.invocation.interceptorContext.proceed(interceptorContext.Java:406)在.Interceptors.UserInterceptorFactory$1.ProcessInvocation(UserInterceptorFactor.java:63)在org.jboss.as.ejb3.Component.InvocationMetrics.ExecutionTimeInterceptor.ProcessInvocation(ExecutionTimeInterceptor.java:43)[Wildfly-EJB3-8.0.0.cr1.jar:8.0.0.cr1]在org.jboss.invocation.InterceptorContext.Proceed(InterceptorContext.java:309)在MPL-2.1.1.final.jar:2013-12-03 09:59]在org.jboss.as.weld.ejb.ejbRequestScopeActivationInterceptor.java:84)[wildfly-weld-8.0.0.cr1.jar:8.0.0.cr1]在org.jboss.invocation.InterceptorContext.Proceed(InterceptorContext.java:309)在ejb3.component.singleton.singletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:52)[Wildfly-EJB3-8.0.0.cr1.jar:8.0.0.cr1]在org.jboss.invocation.InterceptorContext.Proceed(InterceptorContext.java:309)在

    原因:java.lang.IllegalStateException:ArJuna016082:不允许同步!事务状态isActionStatus.running在com.arjuna.ats.internal.jta.Transaction.arjunacore.transactionimple.registersynchronizationimple(transactionimple.java:375)在com.arjuna.ats.internal.jta.Transaction.arjunacore.transactionimple.registersynchronization(transactionimple.java:375)在org.jboss.as.messaging.deployment.jmscontextproducer$jmscontextwrapper.getDelegate

  • 共有1个答案

    南宫书
    2023-03-14

    在我看来这是个虫子。

    jmsContextProducer$jmsContextWrapper.getDelegate()不应该注册与事务的同步。相反,应该使用TransactionSynchronizationRegistry。

    请为此创建https://issues.jboss.org/browse/wfly错误报告。

     类似资料:
    • 我试图通过驼峰路由将消息放到Weblogic JMS中的队列中。 我的目标是最终配置一个Route以使用来自jms队列的消息,我将早期Route的数据发布到该队列。 这是我的配置: 我的路线如下所示: 我尝试执行此路由时遇到此异常: 我按照以下过程创建了此处提到的队列:https://blogs.oracle.com/soaproactive/entry/how_to_create_a_simpl

    • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

    • 主要内容:1 invokeOneway单向发送,1.1 invokeOnewayImpl单向调用,2 sendMessageSync同步发送,2.1 invokeSync同步调用,3 sendMessageAsync异步发送消息,3.1 invokeAsync异步调用,3.2 onExceptionImpl异常处理,4 NettyClientHandler处理服务端消息,4.1 processResponseCommand处理响应,基于RocketMQ release-4.9.3,深入的介绍了P

    • null 谁能给我一个向RabbitMQ发送消息的标准程序的例子。我正在使用Spring Boot,也可以使用它的特性。

    • 我是Spring JMS的新手。我的应用程序是使用Spring Boot开发的,并部署在JBoss EAP7.2.0中。我有一个远程队列,它是一个活动的MQ Artemis队列,也嵌入在JBoss EAP7.2.0中。有人能建议我如何使用Spring Boot的JmsTemplate向远程JMS队列发送消息吗?基本上,我不知道应该如何定义远程connectionFactory来连接到远程队列。

    • 我有两个独立实例(p1、p2)的生产者应用程序和两个独立实例(c1、c2)的消费者应用程序。 生产者p1连接到exchange,主题为t1,队列名称为name1。 使用者c1连接到exchange,主题为t1,队列名称为name1。 生产者p2连接到exchange,主题为t2,队列名称为name1。 使用者c2连接到exchange,主题为t2,队列名称为name1。 我在RabbitMQ GU