是否有类似于Spring的CachingConnectionFactory的实现,它也关闭空闲连接,直到再次需要它们时?

时间:2018-10-02 21:43:57

标签: java spring jms solace

我们正在使用Spring的CachingConnectionFactory通过我们的应用程序每天在生产中处理数千万条消息,并且效果很好。

但是,我们正在寻求减少与Solace的并发连接的数量,直到我们与许多其他应用程序共享我们的ESB基础结构时才需要它们。这个Spring工厂是否有一个懒惰的扩展,可以满足我们的需求?

2 个答案:

答案 0 :(得分:1)

CachingConnectionFactory已经完成了懒惰的连接创建,这是应用程序的责任,如Spring文档中所述,显式关闭未使用的Session,以将它们返回到池中。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/connection/CachingConnectionFactory.html

如果这是给消息使用者使用的,则最好让侦听器容器本身处理适当的缓存,而不是CachingConnectionFactory。 DefaultMessageListenerContainer支持动态缩放。

答案 1 :(得分:1)

我认为需要在此处澄清的是“空闲”的定义-这是否意味着在应用程序的整个生命周期中都不会消耗或产生任何消息?或者只是周期性的不活动,就不活动的持续时间和/或何时发生而言,这可能是可预测的,也可能是不可预测的?而且,如先前的回答所述,惰性资源管理是指建立连接-在“空闲”时不破坏连接-这可能意味着许多事情,如前所述。

通常,消息使用者通常无法预测何时他们的连接将处于空闲状态,因为可以随时接收消息。对于生产者,您可能有一个更好的主意,即您的连接何时将处于空闲状态,尽管通常不值得为每次发布重新创建新连接而产生的开销,就像使用不带CCF / SCF的JmsTemplate那样。无论哪种情况,以下内容都可以帮助进行资源管理:

  1. 如果应用执行周期性的批处理类型的工作,并且不需要在两次运行之间产生或消耗数据,并且之间存在很长的延迟,则可以通过显式管理资源(例如销毁/重新存储)来节省资源。创建CCF),或者在需要时关闭并重新启动-Spring Cloud Task可能符合要求,或者可能是一项cron作业。

  2. 如果可能,请尽量减少@JmsListener回调的数量,因为每个回调都会转换为一个连接。 Solace队列支持多个订阅以及通配符,因此可以将订阅合并到更少的队列中。如果排序不是问题,则可以将concurrency参数传递给@JmsListener,以允许在同一连接上的多个使用者之间进行循环处理。

  3. 将共享的Solace代理的连接卸载到您的应用程序的专用代理,并为共享的代理设置VPN桥接器或DMR(动态消息路由)。

  4. PubSub +软件代理支持从100到200K的各种连接扩展层,因此您可以选择提供足够容量的层。可以在您的专用代理或共享代理上完成此操作,或者根据您的要求和约束来完成。