2

Mule ESB と JBoss Messaging を使用して、シンプルなトランザクション jms-to-jms ルーターを構築しようとしています。以下のように構成されたアプリケーションで Mule ESB を実行すると、奇妙な動作が観察されます。

  1. 約 10 個のメッセージがキュー test1 から test2 にルーティングされます
  2. 約 40 秒間何も起こりません。
  3. 1に行く

テストを開始すると、キュー test1 は約 500 のメッセージでいっぱいになります。Mule 3.2 と JBoss 5.1 を使用しています。

以下のコードからトランザクションを削除すると、すべてが正常に機能し、すべてのメッセージがキュー test2 に即座に送信されます。また、xa-transaction タグを jms:transaction に置き換えて、トランザクションを xa から jms に変更しても問題ありません。

ESB でのメッセージ処理が一時停止する原因はわかりません。おそらくトランザクションのコミットが遅れているのでしょう。

私の質問は、xa トランザクションを正しく機能させるにはどうすればよいですか?

必要に応じて詳細を提供します。以前、Mule ESB フォーラムでこの質問をしましたが、答えはありませんでしたhttp://forum.mulesoft.org/mulesoft/topics/transaction_commit_delay_when_routing_message_from_one_jms_queue_to_another

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:jms="http://www.mulesoft.org/schema/mule/jms" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jbossts="http://www.mulesoft.org/schema/mule/jbossts" version="CE-3.2.1" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/jbossts http://www.mulesoft.org/schema/mule/jbossts/current/mule-jbossts.xsd ">
    <jbossts:transaction-manager> </jbossts:transaction-manager>
    <configuration>  
        <default-threading-profile maxThreadsActive="30" maxThreadsIdle="5"/>  
        <default-receiver-threading-profile maxThreadsActive="10" maxThreadsIdle="5"/> 
    </configuration>
    <spring:beans>
        <spring:bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate" doc:name="Bean">
            <spring:property name="environment">
                <spring:props>
                    <spring:prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</spring:prop>
                    <spring:prop key="jnp.disableDiscovery">true</spring:prop>
                    <spring:prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</spring:prop>
                    <spring:prop key="java.naming.provider.url">localhost:1099</spring:prop>
                </spring:props>
            </spring:property>
        </spring:bean>
        <spring:bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" doc:name="Bean">
            <spring:property name="jndiTemplate">
                <spring:ref bean="jmsJndiTemplate"/>
            </spring:property>
            <spring:property name="jndiName">
                <spring:value>XAConnectionFactory</spring:value>
            </spring:property>
        </spring:bean>
    </spring:beans>
    <jms:connector name="JMS" specification="1.1" numberOfConsumers="10" connectionFactory-ref="jmsConnectionFactory" doc:name="JMS"/>
    <flow name="flow" doc:name="flow">
        <jms:inbound-endpoint queue="test1" connector-ref="JMS" doc:name="qt1">
            <xa-transaction action="ALWAYS_BEGIN"/>
        </jms:inbound-endpoint>
        <echo-component doc:name="Echo"/>
        <jms:outbound-endpoint queue="test2" connector-ref="JMS" doc:name="qt2">
            <xa-transaction action="ALWAYS_JOIN"/>
        </jms:outbound-endpoint>
        <echo-component doc:name="Echo"/>
    </flow>
</mule>

ここでは、1 メッセージ インタラクションのログ フラグメントを見つけることができます。この場合、遅延はありませんでした。そして、ここに 11 個のメッセージのログ フラグメントがあります。10 件のメッセージが即座にルーティングされ、1 件が 1 分遅れていることがわかります。

4

1 に答える 1

1

問題の原因を突き止めました: 私のキューは次の属性で定義されていました:

   <attribute name="RedeliveryDelay">60000</attribute>

それを削除するか、低い値を設定すると、遅延に関する問題が解決します。問題は、理由がわからないことです:)

配信が失敗したときに再配信の遅延が使用されると常に思っていましたが、私のアプリではそうではありませんでした。

于 2012-05-08T13:54:43.030 に答える