将消息从一个jms队列路由到另一个jms队列时的事务提交延迟

时间:2012-05-07 11:23:23

标签: jboss jms jboss5.x mule

我们正在尝试使用Mule ESB和JBoss Messaging构建简单的事务处理jms-to-jms路由器。当我们使用如下配置的应用程序运行Mule ESB时,我们观察到奇怪的行为。

  1. 大约10条消息从队列test1路由到test2
  2. 〜40秒内没有任何事情发生。
  3. 转到1
  4. 当我们开始测试时,队列test1充满了大约500条消息。我们使用Mule 3.2和JBoss 5.1。

    如果我从下面的代码中删除事务,一切正常,所有消息都会立即发送到队列test2。此外,如果我将事务从xa更改为jms - 通过用jms:transaction替换xa-transaction标记,一切都很好。

    我不知道是什么原因导致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>
    

    Here您可以找到1个消息交互的日志片段。请注意,在这种情况下没有延迟。 here是11条消息的日志片段。应用程序启动时,所有这些都在队列test1中,因为您可以看到10条消息立即路由,其中​​一条延迟1分钟。

1 个答案:

答案 0 :(得分:1)

我找到了问题的根源:我的队列定义了以下属性:

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

删除它或设置低值可以解决我的延迟问题。问题是,我不知道为什么:)

我一直认为在交付失败时会使用重新传递延迟,而在我的应用中并非如此。