JMS 连接和会话池

JMS connection & session pooling

我目前正在开发一种产品,它有自己的 JMS 提供程序,但其实现没有很好的记录。我必须在 Java 中准备一个独立的客户端应用程序,它将 post 消息发送到 JMS 队列。我希望有一个巨大的数据量,因此我正在考虑实现一个 JMS 连接池和会话池。

在任何对象池中,我们都需要先判断对象是否健康,然后再返回给客户端。 JMS 似乎没有提供 "isHealthy()" 方法。另外,我不能依赖 ExceptionListener,主要是因为我不确定 JMS 提供程序的实现,而且 ExceptionListener 调用是异步的。我想知道如果在调用onException之前将连接移交给客户端会发生什么。

作为解决方案,我打算使用 TCP 空闲连接超时。我的理解是,只有当 TCP 空闲时间连接超时结束或 JMS 提供程序关闭时,连接才会变得不健康。

因此,我计划创建一个池连接包装器对象,该对象将在创建连接或由客户端返回到池时存储 "last use time"。在将连接移交给客户端之前,池将检查自 "last use time" 以来的时间间隔是否小于 3 分钟(假设默认的 TCP 空闲连接超时为 5 分钟)。

我的理解和实现是否正确?

这是我会做的:

如果失败,则我的连接已断开。然后 GenericObjectPool 会自动调用工厂来创建一个全新的连接 (#makeObject) 来替换死掉的连接。