java - Spring Integration 消息驱动 channel 适配器标签不支持 bean 名称?

标签 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 添加到线程名的前面。

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属性将其提供给适配器。

关于java - Spring Integration 消息驱动 channel 适配器标签不支持 bean 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191518/

相关文章:

java - 使用Jboss部署简单的War文件(J2EE应用程序)时出错

Java 多线程共享同一个对象的同步问题

java - 我是否需要处理或忽略由 OutputStream close() 函数触发的 IOException?

java - OSB fn :bea Function using XQuery Engine in Java

spring-boot - 如何停止/启动/暂停@JmsListener(干净的方式)

java - Tomcat8 使用 AbstractProtocol.pause 随机关闭

ajax - 如何将基于 Spring + Hibernate 的应用程序后端与纯 HTML 和基于 AJAX 的客户端连接?

java - 如何测试@Valid 注解是否有效?

java - JMS (ActiveMQ) 性能

java - JMS:无法通过选择器从主题中选择 jms 消息