2014-12-05 3 views
0

Использование Wildfly и JMS через Hornetq я получил это исключение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); 
    } 
} 

Может быть, я что-то отсутствует, но я не понимаю, почему это происходит. Как правильно обращаться с ним? Мне определенно нужно, чтобы это послание было отправлено, не имеет значения. Заранее спасибо.

EDITED:

Самая важная часть я предполагаю, что приведет меня, чтобы решить эту проблему, является то, что время от времени я получил (в дополнение к закрытым 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. 

Bean, который я закачиваемой MessageSender был аннотирован с помощью @Stateless.

ответ

2

Хорошо, после многих попыток мне удалось решить эту проблему. Что было не так с этой настройкой, так это то, что если в MessageSender не была определена область определения аннотации, она была @Dependent. И это означает, что он был в объеме боба, в который он был введен. В этом случае @Stateless. Создан только один сеанс. Метод из @Stateless bean может запускаться одновременно, и это было основной причиной проблемы. sendMeasge использовал один и тот же сеанс JMS. Простейшим решением этой проблемы является либо обеспечение того, что в sendMessage всегда есть один файл, либо для создания нескольких сеансов. Одним из решения я нашел не использовать @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); 
    } 
} 

В приведенном выше примере мы создаем сессию каждый раз, когда мы посылаем сообщение - так что больше не проблема одновременного использования сеанса и его проблема с закрытым производителем также исчезла.

Если кто-то будет интересно, я рекомендую futher чтение из: http://www.mastertheboss.com/jboss-server/jboss-jms/jms-20-tutorial-on-wildfly-as

+0

полностью такой же вопрос! Мы используем транзакцию JTA, и для нас я нашел объяснение проблемы здесь. Https://issues.jboss.org/browse/WFLY-3338 –