1

我们在应用程序中有一个问题,即 ibm mq 上的 jms 消息提交需要数小时才能完成,这反过来导致 ibm mq 中的日志空间被填满,并且应用程序端的 JVM 挂起问题。为了解决这个问题,我尝试在路由、jms 组件等上实现事务超时。但看起来没有任何效果。

应用程序中有3条路线

  1. 阅读消息(开始路线)
  2. 传递/发送消息
  3. 错误路由(发送到错误队列)

路线定义如下,

输入/消费者路线

public class InputRoute extends SpringRouteBuilder {

    @Override
    public void configure() throws Exception {
    from("wmqInConsumer:{{mq.inputQueue}}?concurrentConsumers={{num.consumers}}&maxConcurrentConsumers={{max.num.consumers}}&defaultTaskExecutorType=ThreadPool&preserveMessageQos=true").routeId("input-route").setHeader("Message_Key").method("headerEnricher", "setKey").inOnly("direct:deliver-normal-route-1");
    }
}

交付路线

public class DeliverRoute extends SpringRouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:deliver-normal-route-1").transacted("PROPAGATION_REQUIRES_NEW").inOnly("direct:deliver-route-2");

        from("direct:deliver-route-2").process("myServicesProcessor").split()
                .method("messageSplitterBean", "splitMessage").shareUnitOfWork().stopOnException()
                .toD("wmqDeliverJms:${headers.Deliver}?preserveMessageQos=true");
    }
}

错误路线

public class ErrorRoute extends SpringRouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:errorChannelRoute").transacted("PROPAGATION_REQUIRES_NEW").inOnly("direct:errorChannelRoute-1");

        from("direct:errorChannelRoute-1").process("errorServicesProcessor").split()
                .method("messageSplitterBean", "splitErrorMessage").shareUnitOfWork().stopOnException()
                .toD("wmqDeliverJms:${headers.Deliver}?preserveMessageQos=true");

    }
}

这里是我根据 Camel 文档尝试的事务超时。但它不起作用,我也没有在跟踪日志中看到事务超时。此外,如果发生超时,不确定消息会发生什么。它会进入错误队列还是完全回滚重试?

在输入路由上,transactionTimeout=10

from("wmqInConsumer:{{mq.inputQueue}}?concurrentConsumers={{num.consumers}}&maxConcurrentConsumers={{max.num.consumers}}&defaultTaskExecutorType=ThreadPool&preserveMessageQos=true&transactionTimeout=10").routeId("input-route").setHeader("Message_Key").method("headerEnricher", "setKey").inOnly("direct:deliver-normal-route-1");

在输入路由 JMS 组件上,

<bean id="wmqInConsumer" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="myConnectionFactory" />
        <property name="transacted" value="true" />
        <property name="transactionTimeout" value="30"></property> -->
    </bean>

在交付路由 JMS 组件上,

<bean id="wmqDeliverJms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="myConnectionFactory" />
        <property name="destinationResolver" ref="myJmsDestinationResolver" />
        <property name="transacted" value="true" />
        <property name="transactionTimeout" value="30"></property>
    </bean>
4

0 回答 0