我正在使用Spring Integration 4.0.3.RELEASE和Spring Framework 4.0.2.RELEASE。
我的上下文文件中包含以下Spring Integration代码:
<int-jms:message-driven-channel-adapter id="exchangeQueueChannelAdapter"
auto-startup="true"
destination="exchangeQueueJmsDestination"
channel="exchangeSpringQueueChannel"
receive-timeout="1000"
connection-factory="WMQCachedConnectionFactory"
acknowledge="transacted"
transaction-manager="WMQTxManager"
error-channel="errorChannel"/>
注意,我给正在创建的bean命名为[exchangeQueueChannelAdapter]。
当底层
DefaultMessageListenerContainer
中发生异常时,它看起来并不像Spring Integration标记将beanName传递给DefaultMessageListenerContainer
类。这将导致如下所示的异常(注意线程名称):[org.springframework.jms.listener.DefaultMessageListenerContainer#0-1] WARN (org.springframework.jms.listener.DefaultMessageListenerContainer) - Setup of JMS message listener invoker failed for destination 'queue://CDCS.F370ZZZ.TRADOUT.FIXML' - trying to recover. Cause: Could not create JMS transaction; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
[DefaultMessageListenerContainer-1] ERROR (org.springframework.jms.listener.DefaultMessageListenerContainer) - Could not refresh JMS Connection for destination 'citi.cibtech.na.ExPro_149155.DERIVS_ETD_TRD.TMG_CONTROLBUS.T1' - retrying in 5000 ms. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
查看
DefaultMessageListenerContainer
代码,如果在初始化时将beanName传递到类中,则似乎会将beanName放在线程名的前面。protected TaskExecutor createDefaultTaskExecutor() {
String beanName = getBeanName();
String threadNamePrefix = (beanName != null ? beanName + "-" : DEFAULT_THREAD_NAME_PREFIX);
return new SimpleAsyncTaskExecutor(threadNamePrefix);
}
理想情况下,我希望有一种方法可以使线程将我的bean名称放在thead名称的某个位置(即“ exchangeQueueChannelAdapter#0-1”)。有没有一种方法可以不必自己创建
DefaultMessageListenerContainer
?也许我缺少什么? 最佳答案
您可以使用自定义名称创建外部TaskExecutor
,然后将以这种方式命名线程...
<task:executor id="foo" />
线程将被命名为“ foo-n”
使用
task-executor
属性将其提供给适配器。