Spring集成:如何将SingleConnectionFactory与ActiveMQ结合使用?

Spring集成:如何将SingleConnectionFactory与ActiveMQ结合使用?,spring,spring-integration,activemq,spring-jms,Spring,Spring Integration,Activemq,Spring Jms,弹簧防尘套2.3.1.释放 使用spring.jms.cache.enabled=true(默认值),spring创建CachingConnectionFactory: @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true", matchIfMissing = true)

弹簧防尘套2.3.1.释放

使用
spring.jms.cache.enabled=true
(默认值),spring创建
CachingConnectionFactory

    @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true",
            matchIfMissing = true)
    static class CachingConnectionFactoryConfiguration {
    @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "false")
    ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties,
            ObjectProvider<ActiveMQConnectionFactoryCustomizer> factoryCustomizers) {
        return createJmsConnectionFactory(properties, factoryCustomizers);
    }

    private static ActiveMQConnectionFactory createJmsConnectionFactory(ActiveMQProperties properties,
这很糟糕。我想这就是为什么我的一些信息会“丢失”直到它们突然出现的原因

使用
spring.jms.cache.enabled=false
,spring创建一个
ActiveMQConnectionFactory

    @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true",
            matchIfMissing = true)
    static class CachingConnectionFactoryConfiguration {
    @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "false")
    ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties,
            ObjectProvider<ActiveMQConnectionFactoryCustomizer> factoryCustomizers) {
        return createJmsConnectionFactory(properties, factoryCustomizers);
    }

    private static ActiveMQConnectionFactory createJmsConnectionFactory(ActiveMQProperties properties,
所以我想我会:

Jms.channel(connectionFactory)
    .cacheLevel(DefaultMessageListenerContainer.CACHE_CONNECTION)
但事实证明,这个方法从未被调用过,只有
JmsAccessor.createConnection()
创建了一个
ActiveMQConnectionFactory
。我的缓存级别无效


那么如何正确使用
SingleConnectionFactory
呢?

如果您具有可变并发性,缓存工厂只是DMLC的一个问题

只需将
singleconctionfactory
定义为
@Bean
,并使用
Jms.channel(mySingleCF())…

编辑

@springboot应用程序
公共类SO63120705应用程序{
公共静态void main(字符串[]args){
run(So63120705Application.class,args).close();//JVM应该退出
}
@豆子
公共应用程序运行程序运行程序(ConnectionFactory jmsConnectionFactory、IntegrationFlowContext上下文、,
JmsTemplate(模板){
返回参数->{
SingleConnectionFactory connectionFactory=新的SingleConnectionFactory(jmsConnectionFactory);
IntegrationFlow=f->f.channel(Jms.channel(connectionFactory)
.目的地(“foo”))
.handle(System.out::println);
上下文。注册(流)
.id(“jms”)
.addBean(连接工厂)
.register();
convertAndSend(“foo”,“test”);
睡眠(5_000);
};
}
}

我们刚刚测试过,它可以正常工作。您可能对Jms.channel()的性质感到困惑。与应用该
缓存连接的
DefaultMessageListenerContainer
容器一起,它还有一个
JmsTemplate
部分,用于将消息发送到JMS。这一个确实在其交互上从工厂创建了一个新的连接。使用这个
Jms.channel(新的SingleConnectionFactory(connectionFactory))
进行测试,看起来目标
ActiveMQConnectionFactory.createConnection()
实际上只调用了一次:
Mockito.verify(this.connectionFactory).createConnection()
非常感谢您的支持,Gary。我试着按照你的建议去做,但我不知道如何正确地
SingleConnectionFactory
作为一个bean,而不必创建我自己的
ActiveMQConnectionFactory
并自己进行所有属性绑定。与此同时,我尝试了一下
spring.activemq.pool.enable=true
(使用
org.messaginghub:pooledjms
)并且成功了。一旦时间压力消失,我将再次尝试你的解决方案:)这是正确的;一旦定义了类型为
ConnectionFactory
的任何bean,您就可以自己使用
@ConditionalOnMissingBean(ConnectionFactory.class)
。不幸的是,虽然Artem的建议解决了这个问题,但它导致了另一个问题,因为它不是
@Bean
,并且当上下文关闭且JVM不退出时,
destroy()
永远不会被调用。一种解决方案是动态注册流,这允许您将其添加为bean—请参阅对我的答案的编辑。