Как совместить Spring Boot HornetQAutoConfiguration и CachingConnectionFactory?

При переходе с Spring Boot 1.1.4 на 1.2.3 возникает следующая проблема:

В нашей конфигурации Spring Java в версии 1.1.4 мы объединили org.springframework.jms.connection.CachingConnectionFactory с шаблоном jmsConnectionFactory, созданным org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration, и все заработало нормально.

В версии 1.2.3 HornetQAutoConfiguration была сильно переработана, что теперь заставляет задуматься, как настроить использование CachingConnectionFactory без написания всей конфигурации с нуля.

Сценарий все еще действителен для использования CachingConnectionFactory с HornetQ в Spring Boot для кэширования JMS Sessions и MessageProducers?

Если да, то как можно настроить CachingConnectionFactory в Spring Boot 1.2.3?

Должен ли этот вопрос быть преобразован в проблему Spring Boot?


person robot007    schedule 03.05.2015    source источник
comment
Примечание: в версии 1.1.4 была гибкость благодаря общедоступному методу HornetQAutoConfiguration.jmsConnectionFactory(), который больше не доступен в версии 1.2.3. Можно было создать подкласс HornetQAutoConfiguration и вызвать этот метод через супер в терминах фабричного метода, а затем обернуть результат с помощью CachingConnectionFactory.   -  person robot007    schedule 03.05.2015
comment
Самый простой способ, который я вижу, - это просто создать BeanPostProcessor, который проверяет, является ли bean-компонент ConnectionFactory, а затем оборачивает его в CachingConnectionFactory, это будет работать с любой реализацией JMS, без расширения каких-либо конкретных классов Spring Boot. (Это должно работать независимо от версии Spring Boot).   -  person M. Deinum    schedule 03.05.2015
comment
Действительно сложно обернуть автоматически сконфигурированный bean-компонент в ваши настройки. Я думаю, что мы можем представить проблему поддержки CachingConnectionFactory или немного открыть API, чтобы предложить такую ​​поддержку. Пожалуйста, создайте проблему   -  person Stephane Nicoll    schedule 12.05.2015
comment
Спасибо, я открыл задачу: github.com/spring-projects/spring-boot /вопросы/2956   -  person robot007    schedule 16.05.2015


Ответы (1)


Это решение с собственным BeanPostProcessor сработало для меня. Вы можете включить кэширование ConnectionFactory с помощью свойства jms.useCachingConnectionFactory = true в вашем application.properties.

@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;
    }
}
person spx01    schedule 27.04.2016