2012-04-26 2 views
0

Я использую интеграцию весны для связи через активный mq. У меня есть следующая конфигурация.Как инициализировать интеграцию с пружиной: шлюз при запуске?

<integration:channel id="riskApprovalRequestChannel"/> 
    <integration:channel id="riskApprovalResponseChannel"/> 

    <jms:outbound-gateway id="riskApprovalServiceGateway" 
          request-destination-name="${risk.approval.queue.request}" 
          reply-destination-name="${risk.approval.queue.response}" 
          request-channel="riskApprovalRequestChannel" 
          reply-channel="riskApprovalResponseChannel" 
          connection-factory="jmsConnectionFactory" 
          receive-timeout="1000"/> 

    <integration:gateway id="riskApprovalService" service-interface="com.my.ServiceInterface" 
         default-request-channel="riskApprovalRequestChannel" 
         default-reply-channel="riskApprovalResponseChannel"/> 

Это хорошо работает, за исключением 1-го запроса, который работает медленно. Я всегда ударил 1-й тайм-аут по первому запросу. Там, очевидно, происходит какая-то ленивая загрузка.

Мой вопрос: как мне сделать полную инициализацию при запуске, чтобы избежать 1-го запроса, всегда сглаживания?

Приветствия,

Питер

ответ

1

Это, вероятно установление соединения, что это проблема.

Одна вещь, которую вы можете сделать, - это обернуть поставщика ConnectionFactory в Spring CachingConnectionFactory (это полезно сделать так или иначе по причинам производительности) и вызвать createConnection() во время инициализации.

Существует несколько способов сделать это - включая инжекцию фабрики соединений в какой-либо другой компонент, с помощью метода init-метода, метода @PostConstruct или InitializingBean с afterPropertiesSet(); он будет вызываться во время инициализации контекста.

Это приведет к активному подключению кэш-памяти.

Возможно, вы захотите сделать это в блоке try, чтобы избежать неудачного инициализации контекста приложения, поскольку брандмауэр JMS недоступен (конечно, обмен сообщениями по-прежнему не удастся, но приложение будет готово к подключению, когда брокер).

+0

Russel: Я уже использую Spring CachingConnectinoFactory. Добавление init-method = "createConnection" действительно исправить ситуацию, но я подозреваю, что он также покидает сиротское соединение, плавающее вокруг. Я закончил с использованием , который, похоже, выполняет эту работу. Принял ответ, как он указал мне в правильном направлении. –

+0

Не должно быть никаких дополнительных подключений, поскольку CCF использует одно соединение (это подкласс SingleConnectionFactory, который добавляет кеширование сессий, расходников и производителей). –

+0

Использование фабричного компонента для желаемого создания соединения - это аккуратный трюк. Но, как я заметил в другом потоке, вам не нужен init-метод - он ничего не делает, поскольку единственное соединение сохраняется для повторного использования. –

Смежные вопросы