使用 spring 集成自动配置 ActiveMQ

And*_*alk 5 spring activemq-classic spring-integration spring-jms spring-boot

在当前版本中,spring boot 还可以在检测到 ActiveMQ 在类路径上可用时配置 ConnectionFactory。如果存在代理,则会自动启动和配置嵌入式代理。

这在使用 JMSTemplate 时似乎是正确的。如果我想使用 spring 集成自动配置,那么不幸的是这不起作用。ActiveMQ 似乎是在 spring 集成之后配置的。Spring boot 报告缺少连接工厂的错误。为此,我正在使用 spring boot 版本 1.1.4 和最新版本的 spring 集成。

我从 spring boot 得到这个堆栈跟踪:

2014-08-08 09:24:21.050 ERROR 6728 --- [           main]    
o.s.boot.SpringApplication               : Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.springframework.integration.jms.JmsSendingMessageHandler#0': 
Cannot create inner bean '(inner bean)#54930080' of type 
[org.springframework.integration.jms.DynamicJmsTemplate] while setting constructor 
argument; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name '(inner bean)#54930080': Cannot resolve reference to 
bean 'connectionFactory' while setting bean property 'connectionFactory'; nested 
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean 
named 'connectionFactory' is defined
at 
org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(
BeanDefinitionValueResolver.java:290)
at   
org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveValueIfNecessary(BeanDefinitionValueResolver.java:129)
Run Code Online (Sandbox Code Playgroud)

对我来说,就 spring 集成和 jms 模板而言,spring boot 自动配置中的依赖项似乎不正确。标准 JMS 自动配置如下所示:

@ConditionalOnClass(JmsTemplate.class)
@ConditionalOnBean(ConnectionFactory.class)
@EnableConfigurationProperties(JmsProperties.class)
@AutoConfigureAfter({ HornetQAutoConfiguration.class, 
ActiveMQAutoConfiguration.class })
public class JmsAutoConfiguration 
Run Code Online (Sandbox Code Playgroud)

Spring 集成如下所示:

@Configuration
@ConditionalOnClass(EnableIntegration.class)
@AutoConfigureAfter(JmxAutoConfiguration.class)
public class IntegrationAutoConfiguration {
Run Code Online (Sandbox Code Playgroud)

spring 集成创建的关于连接工厂和活动 mq 的动态 jms 模板不应该至少有某种自动配置。考虑到 spring boot ref docs,我希望使用 jms 进行正确的自动配置以进行 spring 集成?

And*_*y N 2

好的,我知道了。这是一个错误(我认为)。

ActiveMQConnectionFactoryConfiguration创建一个名为“jmsConnectionFactory”的 bean,但查看堆栈跟踪(上图)Spring Integration 正在寻找要命名的 bean:“connectionFactory”

编辑: INT-3941已打开

解决方法:

@Configuration
public static class SpringBootVsIntegraionWorkaround {
    @Autowired
    GenericApplicationContext genericApplicationContext;

    @PostConstruct
    public void init() {
        genericApplicationContext.registerAlias("jmsConnectionFactory", "connectionFactory");
    }
}
Run Code Online (Sandbox Code Playgroud)