Jms 如何结合Spring Boot HornetQAutoConfiguration和CachingConnectionFactory?
从Spring Boot 1.1.4迁移到1.2.3,我们遇到以下问题: 在1.1.4下的SpringJava配置中,我们将Jms 如何结合Spring Boot HornetQAutoConfiguration和CachingConnectionFactory?,jms,spring-boot,hornetq,spring-jms,Jms,Spring Boot,Hornetq,Spring Jms,从Spring Boot 1.1.4迁移到1.2.3,我们遇到以下问题: 在1.1.4下的SpringJava配置中,我们将org.springframework.jms.connection.CachingConnectionFactory与由org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration模板化的jmsConnectionFactory结合在一起,效果很好 在1.2.3中,HornetQAu
org.springframework.jms.connection.CachingConnectionFactory
与由org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration
模板化的jmsConnectionFactory结合在一起,效果很好
在1.2.3中,HornetQAutoConfiguration经过了大量修改,现在让我们想知道如何配置CachingConnectionFactory的使用,而不必从头开始编写整个配置
在Spring Boot中使用带有HornetQ的CachingConnectionFactory来缓存JMS会话
s和MessageProducer
s是否仍然有效
如果答案是肯定的,那么如何在Spring Boot 1.2.3下配置CachingConnectionFactory
这个问题应该转化为Spring启动问题吗?这个带有自己的
BeanPostProcessor
的解决方案适合我。您可以在application.properties中使用属性jms.useCachingConnectionFactory=true启用ConnectionFactory
的缓存
@ConditionalOnProperty(prefix = "jms", value = "useCachingConnectionFactory", havingValue = "true", matchIfMissing = false)
public class CachingConnectionFactoryDecoratingPostProcessor implements BeanPostProcessor
{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
{
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
{
if (bean instanceof ConnectionFactory)
{
return new CachingConnectionFactory((ConnectionFactory) bean);
}
return bean;
}
}
注意:在1.1.4中,由于1.2.3中不再提供的公共方法
HornetQAutoConfiguration.jmsConnectionFactory()
,因此具有灵活性。可以将HornetQAutoConfiguration子类化,并根据工厂方法通过super调用该方法,然后用CachingConnectionFactory包装结果。我看到的最简单的方法就是创建一个BeanPostProcessor
,它检查一个bean是否是ConnectionFactory
,然后将其包装在CachingConnectionFactory
中,这将适用于任何JMS实现,不扩展任何特定的Spring引导类。(无论Spring启动版本如何,这都应该有效)。在定制中包装自动配置的bean确实很棘手。我认为我们可以设想一个支持CachingConnectionFactory
的问题,或者稍微打开一点API来提供这样的支持。请创建一个问题,我打开了一个问题: