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