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