我目前正在开发一个产品,该产品有自己的 JMS 提供程序,其实现没有详细记录。我必须用 Java 准备一个独立的客户端应用程序,它将消息发送到 JMS 队列。我预计会有巨大的数据量,因此我正在考虑实现 JMS 连接池和 session 池。
在任何对象池中,我们都需要在将对象返回给客户端之前确定对象是否健康。 JMS 似乎没有提供“isHealthy()”方法。另外,我无法依赖 ExceptionListener,主要是因为我不确定 JMS 提供程序的实现,而且 ExceptionListener 调用是异步的。我想知道如果在调用onException之前将连接交给客户端会发生什么。
作为解决方案,我计划使用 TCP 空闲连接超时。我的理解是,只有当 TCP 空闲时间连接超时结束或 JMS 提供程序关闭时,连接才会变得不健康。
因此,我计划创建一个池化的连接包装对象,该对象将在创建连接或由客户端将连接返回到池时存储“上次使用时间”。在将连接移交给客户端之前,池会检查距“上次使用时间”的时间间隔是否小于 3 分钟(假设默认 TCP 空闲连接超时为 5 分钟)。
我的理解和实现是否正确?
最佳答案
这是我要做的:
- 使用 Apache Apache Commons Generic Object Pool
- 在我的 PoolableObjectFactory 实现中(输入通用对象池实例),我将实现
#validateObject
方法来执行 QueueBrowser#getQueue
或#getEnumeration
。
如果失败,那么我的连接就断了。然后,GenericObjectPool 会自动调用工厂来创建一个全新的连接 (#makeObject
) 以替换失效的连接。
关于java - JMS 连接和 session 池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482192/