2012-04-26 119 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

這可能是連接建立這是個問題。

你可以做的一件事是將供應商ConnectionFactory包裝到Spring CachingConnectionFactory中(出於性能原因,這是一個很好的做法),並在初始化期間調用createConnection()。有很多方法可以做到這一點 - 包括使用init-method,@PostConstruct方法或帶有afterPropertiesSet()的InitializingBean將連接工廠注入其他bean;它將在上下文初始化期間被調用。

這將導致高速緩存連接熱切連接。

您可能希望在try塊中執行此操作,以避免應用程序上下文無法初始化,因爲JMS代理不可用(當然,消息傳遞仍然會失敗,但應用程序將啓動並準備好連接經紀人可用)。

+0

Russel:我已經在使用Spring CachingConnectinoFactory。添加init-method =「createConnection」確實解決了一些問題,但我懷疑它也會使孤立的連接浮動。我結束了使用 這似乎是做這項工作。 接受了答案,因爲它指向了正確的方向。 – 2012-04-27 06:01:57

+0

不應該有任何額外的連接,因爲CCF使用單個連接(它是SingleConnectionFactory的子類,它增加了會話,消費者和生產者的緩存)。 – 2012-04-27 17:39:14

+0

使用工廠bean熱切地創建連接是一個巧妙的技巧。但是,正如我在其他線程中指出的那樣,您不需要init方法 - 它不會執行任何操作,因爲單個連接會保留以供重用。 – 2012-05-03 12:31:20