【问题标题】:JMS Producer is closedJMS Producer 已关闭
【发布时间】:2015-02-03 09:58:30
【问题描述】:

通过 Hornetq 使用 Wildfly 和 JMS 我遇到了这个异常

javax.ejb.EJBTransactionRolledbackException: Producer is closed

每隔几个小时就会发生一次或两次。

Caused by: javax.jms.IllegalStateRuntimeException: Producer is closed
        at org.hornetq.jms.client.JmsExceptionUtils.convertToRuntimeException(JmsExceptionUtils.java:60) [hornetq-jms-client-2.4.1.Final.jar:]
        at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:112) [hornetq-jms-client-2.4.1.Final.jar:]
        at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:230) [hornetq-jms-client-2.4.1.Final.jar:]
        at com.turbineam.tradeagent.message.MessageSender.sendMessage(MessageSender.java:26) [classes:]
        at com.turbineam.tradeagent.agent.TradeAgent.sendMessage(TradeAgent.java:36) [classes:]
        at com.turbineam.tradeagent.agent.TradeAgent.handleMessage(TradeAgent.java:82) [classes:]
        at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source) [:1.8.0_05]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_05]
        at java.lang.reflect.Method.invoke(Method.java:483) [rt.jar:1.8.0_05]
        at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
        at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
        at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82) [wildfly-weld-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) [wildfly-weld-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
        at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) [wildfly-ejb3-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
        at org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:104) [wildfly-ejb3-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
        at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) [weld-core-impl-2.2.6.Final.jar:2014-10-03 10:05]
        at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) [wildfly-weld-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) [wildfly-ee-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
        at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:52) [wildfly-ejb3-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:251) [wildfly-ejb3-8.2.0.Final.jar:8.2.0.Final]
        ... 201 more
Caused by: javax.jms.IllegalStateException: Producer is closed
        at org.hornetq.jms.client.HornetQMessageProducer.checkClosed(HornetQMessageProducer.java:537) [hornetq-jms-client-2.4.1.Final.jar:]
        at org.hornetq.jms.client.HornetQMessageProducer.send(HornetQMessageProducer.java:206) [hornetq-jms-client-2.4.1.Final.jar:]
        at org.hornetq.jms.client.HornetQMessageProducer.send(HornetQMessageProducer.java:200) [hornetq-jms-client-2.4.1.Final.jar:]
        at org.hornetq.ra.HornetQRAMessageProducer.send(HornetQRAMessageProducer.java:145)
        at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:107) [hornetq-jms-client-2.4.1.Final.jar:]
        ... 240 more

Sender 创建如下:

@Slf4j
public class MessageSender {

    @Inject
    @JMSConnectionFactory("java:jboss/DefaultJMSConnectionFactory")
    private JMSContext context;

    public void sendMessage(Destination destination, String messageId, Serializable serializable) throws NamingException, JMSException {

        log.debug("Sending a message: " + serializable.toString());
        context.createProducer().setJMSCorrelationID(messageId).send(destination, serializable);
    }
}

也许我遗漏了一些东西,但我不明白为什么会这样。如何正确处理?无论如何,我绝对需要发送此消息。提前致谢。

编辑:

我想导致我解决这个问题的最重要的部分是我不时得到(除了关闭的Producer):

WARN  [org.hornetq.core.client] (ejb) HQ214021: Invalid concurrent session usage. Sessions are not supposed to be used by more than one thread concurrently.

我将 MessageSender 注入到的 Bean 使用 @Stateless 进行了注释。

【问题讨论】:

    标签: ejb jms wildfly hornetq


    【解决方案1】:

    好的,经过多次尝试,我设法解决了这个问题。这个设置的问题在于,如果没有在 MessageSender 上提供注释确定范围,那么它就是 @Dependent。这意味着它属于注入它的 bean 的范围。在那种情况下@Stateless。只创建了一个会话。 @Stateless bean 的方法可以同时运行,这是问题的主要原因。 sendMeasge 使用了相同的 JMS 会话。解决这个问题最简单的方法是要么确保 sendMessage 中始终存在 thred,要么创建多个会话。我发现的解决方案之一是通过以下方式使用@RequestScope:

    @Slf4j
    @RequestScope
    public class MessageSender {
    
        @Inject
        @JMSConnectionFactory("java:jboss/DefaultJMSConnectionFactory")
        private JMSContext context;
    
        public void sendMessage(Destination destination, String messageId, Serializable serializable) throws NamingException, JMSException {
    
            log.debug("Sending a message: " + serializable.toString());
            context.createProducer().setJMSCorrelationID(messageId).send(destination, serializable);
        }
    }
    

    在上面的示例中,我们每次发送消息时都会创建会话 - 因此不再存在并发会话使用问题,并且关闭生产者的问题也消失了。

    如果有人感兴趣,我建议您进一步阅读以下内容: http://www.mastertheboss.com/jboss-server/jboss-jms/jms-20-tutorial-on-wildfly-as

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 2021-06-19
    • 2014-10-02
    • 2013-04-27
    • 2014-02-10
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多