XAトランザクションで遊んでいます。現時点では、それらを JMS と統合しようとしています。しかし、代わりに、失敗したセマフォの取得に関する不可解な例外がいくつか発生します。
ここに私のMDBがあります:
@javax.ejb.MessageDriven(messageListenerInterface = MessageListener.class)
@org.jboss.ejb3.annotation.AspectDomain("Tibco/Simple.Request.Queue")
@org.jboss.ejb3.annotation.Pool(
value = PoolDefaults.POOL_IMPLEMENTATION_STRICTMAX,
maxSize = 1,
timeout = Long.MAX_VALUE
)
public class FeedReconciliationMessageBean implements MessageListener {
@EJB
private SimpleController simpleController;
@Override
public void onMessage(TrsFeedReconciliationRequestPayload message) {
simpleController.reconciliate(message.getReconId());
}
}
アクティベーション構成:
<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)
興味深いのは、MDB が呼び出されることです。メソッドにブレークポイントを設定しておりonMessage
、メッセージが送信されるとonMessage
メソッドで停止します。しかし同時に、server.log に上記のような例外が 7 つほど記録されています。
もう 1 つの興味深い点はonMessage
、実行中に例外が発生しないにもかかわらず、2 回呼び出されることです。
この問題をググってみました。私が見つけた最も一般的な解決策は、ejb プール サイズを増やすことでした。これは、JMSプリフェッチ サイズが EJBプール サイズよりも小さい場合、すべてのメッセージを処理するのに十分な EJB がプールにない可能性があるというものでした。そのため、タイムアウト後に例外がスローされます。しかし、ご覧のとおり、これはまったく別のものです。例外のstrictTimeout値が -1なのはなぜですか? XAトランザクションと関係があると思います。