Jms XA事务-javax.ejb.EJBException:未能获取池信号量,strictTimeout=-1

Jms XA事务-javax.ejb.EJBException:未能获取池信号量,strictTimeout=-1,jms,ejb-3.0,jboss5.x,xa,tibco-ems,Jms,Ejb 3.0,Jboss5.x,Xa,Tibco Ems,我在玩XA事务。目前,我正在尝试将它们与JMS集成。但我得到了一些关于信号量获取失败的神秘异常 这是我的MDB: 激活配置: 队列配置: 因此,每次我向队列发送消息时,都会出现如下异常: 2014-04-03 09:44:10,734 [WorkManager(2)-64] ERROR [org.jboss.resource.adapter.jms.inflow.JmsServerSession] Unexpected error delivering message MapMessage={

我在玩XA事务。目前,我正在尝试将它们与JMS集成。但我得到了一些关于信号量获取失败的神秘异常

这是我的MDB:

激活配置:

队列配置:

因此,每次我向队列发送消息时,都会出现如下异常:

2014-04-03 09:44:10,734 [WorkManager(2)-64] ERROR [org.jboss.resource.adapter.jms.inflow.JmsServerSession] Unexpected error delivering message MapMessage={ Header={ JMSMessageID={ID:EMS-SERVER.3585339006611AE:4} JMSDestination={Queue[Simple.Request.Queue]} JMSReplyTo={null} JMSDeliveryMode={PERSISTENT} JMSRedelivered={true} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Thu Apr 03 09:44:10 MSD 2014} JMSExpiration={0} JMSPriority={4} } Properties={ JMSXDeliveryCount={Integer:7} } Fields={ userSessionId={null} payloadType={String:SimplePayload} processInstanceId={null} payloadFullType={String:com.example.SimplePayload} payload={String:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SimplePayload>
    <test>1</test>
</SimplePayload>
} } }

javax.ejb.EJBException: Failed to acquire the pool semaphore, strictTimeout=-1
    at org.jboss.ejb3.pool.StrictMaxPool.get(StrictMaxPool.java:127)
    at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:58)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
    at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
有趣的是MDB确实会被调用。我在onMessage方法中设置了一个断点,当消息被发送时,我会在onMessage方法中停止。但同时,我在server.log中发现了7个类似于上面的异常

另一件有趣的事情是,onMessage被调用了两次,即使在执行过程中没有发生异常


我试图用谷歌搜索这个问题。我发现的最常见的解决方案是增加ejb池的大小。解释是,如果JMS预取大小小于EJB池大小,则池中可能没有足够的EJB来处理所有消息。因此,超时后会引发异常。但正如你所看到的,这是完全不同的。为什么异常中的strictTimeout值为-1?我认为这与XA事务有关。

这可能是由以下设置引起的:timeout=Long.MAX_VALUE@steve不,我第一次遇到这个问题时,没有这样的设置。后来我又加上了,希望这会有所帮助,但没有用。
    <domain name="Tibco/Simple.Request.Queue" extends="Message Driven Bean" inheritBindings="true">
    <annotation expr="!class(@org.jboss.ejb3.annotation.DefaultActivationSpecs)">
    @org.jboss.ejb3.annotation.DefaultActivationSpecs 
        (value={ 
        @javax.ejb.ActivationConfigProperty(propertyName="destination", 
            propertyValue="/com/example/Simple.Request.Queue:queue"),
        @javax.ejb.ActivationConfigProperty(propertyName="user",
                                            propertyValue=""), 
        @javax.ejb.ActivationConfigProperty(propertyName="password",
                                            propertyValue=""), 
        @javax.ejb.ActivationConfigProperty(propertyName="providerAdapterJNDI", 
                                            propertyValue="java:/TIBCOJMSProvider"), 
        @javax.ejb.ActivationConfigProperty(propertyName="destinationType", 
                                            propertyValue="javax.jms.Queue"),
        @javax.ejb.ActivationConfigProperty(propertyName="useDLQ",
                                            propertyValue="false"),
        @javax.ejb.ActivationConfigProperty(propertyName="transactionTimeout",
                                            propertyValue="43200000") })
    </annotation>
</domain>
show queue Simple.Request.Queue
 Queue:                 Simple.Request.Queue
 Type:                  static
 Properties:            *prefetch=5,*store=$sys.nonfailsafe
 JNDI Names:            "/com/example/Simple.Request.Queue:queue"
 Bridges:               <none>
 Receivers:             1
 Pending Msgs:          0
 Delivered Msgs:        0
 Pending Msgs Size:     0.0 Kb
2014-04-03 09:44:10,734 [WorkManager(2)-64] ERROR [org.jboss.resource.adapter.jms.inflow.JmsServerSession] Unexpected error delivering message MapMessage={ Header={ JMSMessageID={ID:EMS-SERVER.3585339006611AE:4} JMSDestination={Queue[Simple.Request.Queue]} JMSReplyTo={null} JMSDeliveryMode={PERSISTENT} JMSRedelivered={true} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Thu Apr 03 09:44:10 MSD 2014} JMSExpiration={0} JMSPriority={4} } Properties={ JMSXDeliveryCount={Integer:7} } Fields={ userSessionId={null} payloadType={String:SimplePayload} processInstanceId={null} payloadFullType={String:com.example.SimplePayload} payload={String:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SimplePayload>
    <test>1</test>
</SimplePayload>
} } }

javax.ejb.EJBException: Failed to acquire the pool semaphore, strictTimeout=-1
    at org.jboss.ejb3.pool.StrictMaxPool.get(StrictMaxPool.java:127)
    at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:58)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
    at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)