Spring Integration消息驱动的通道适配器标签不符合bean名称?

时间:2014-08-07 20:22:13

标签: java spring jms spring-integration spring-jms

我正在使用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添加到threadname的前面。

protected TaskExecutor createDefaultTaskExecutor() {
  String beanName = getBeanName();
  String threadNamePrefix = (beanName != null ? beanName + "-" : DEFAULT_THREAD_NAME_PREFIX);
  return new SimpleAsyncTaskExecutor(threadNamePrefix);
}

理想情况下,我想要一种能够让线程在thead名称中的某个地方使用我的bean名称的方法(即“exchangeQueueChannelAdapter#0-1”)。有没有办法在不必自己创建DefaultMessageListenerContainer的情况下做到这一点?也许我错过了什么?

1 个答案:

答案 0 :(得分:0)

您可以使用自定义名称创建外部TaskExecutor,并以这种方式命名线程...

<task:executor id="foo" />

线程将命名为&#34; foo-n&#34;

使用task-executor属性将其提供给适配器。