池维护线程示例

使用 Enterprise Java Bean (EJB) 示例来了解池维护线程的工作方式。 请注意,您也可以使用消息驱动的 Bean (MDB) 和侦听器端口,您只需通过某种方式获取空闲池中的连接即可。

请参阅 执行出站消息传递的应用程序如何使用连接池 ,以获取 sendMessage() 方法的更多详细信息。

您已为连接工厂配置了以下值:
  • Reap time 的缺省值为 180 秒
  • Aged timeout 的缺省值为零秒
  • Unused timeout 设置为 300 秒
在启动应用程序服务器之后,将调用 sendMessage() 方法。

此方法使用 jms/CF1 工厂创建一个连接(例如名为 c1),使用该工厂发送消息,然后调用 connection.close() 以使 c1 能够被放入空闲池中。

180 秒之后,池维护线程将启动,并查看 jms/CF1 的空闲连接池。 该池中有一个空闲连接 c1,因此维护线程会查看放回该连接的时间,并将该值与当前时间进行比较。

自连接放入空闲池以来已经过 180 秒,这小于 jms/CF1Unused timeout 属性的值。 因此,维护线程不对该连接进行处理。

再过 180 秒之后,池维护线程再次运行。 维护线程会找到连接 c1,并确定该连接已在池中 360 秒,这比设置的 Unused timeout 值长,因此连接管理器会关闭该连接。

如果现在再次运行 sendMessage() 方法,那么当应用程序调用 connectionFactory.createConnection() 时,连接管理器将创建到 IBM® MQ 的新连接,因为连接工厂的可用连接池为空。

上述示例显示了当 Aged timeout 属性设置为零时,维护线程如何使用 Reap timeUnused timeout 属性来防止旧连接。

Aged timeout 属性如何工作?

在以下示例中,假设您已经将:
  • Aged timeout 属性到 300 秒
  • Unused timeout 属性为零。

您调用 sendMessage() 方法,此方法尝试使用 jms/CF1 连接工厂创建连接。

由于该工厂的空闲池为空,因此连接管理器会创建新连接 c1,并将其返回给应用程序。 当 sendMessage() 调用 connection.close() 时,c1 将被放回到空闲连接池中。

180 秒之后,池维护线程将运行。 该线程在空闲连接池中发现 c1,并检查自其创建以来经过的时间。 连接已存在 180 秒,这小于 Aged timeout,因此池维护线程会将其单独保留并返回到休眠状态。

60 秒之后,再次调用 sendMessage()。 这一次,当该方法调用 connectionFactory.createConnection() 时,连接管理器将发现 jms/CF1 空闲池中有一个可用连接 c1。 连接管理器将 c1 从空闲池中取出,并将该连接分配给应用程序。

sendMessage() 退出时,该连接将被返回到空闲池中。 120 秒之后,池维护线程再次被唤醒,扫描 jms/CF1 的空闲池内容,并发现 c1

虽然该连接在 120 秒前才使用,但池维护线程会关闭该连接,因为该连接已存在总共 360 秒,这比您为 Aged timeout 属性设置的 300 秒值长。

“最低连接数”属性对池维护线程的影响

再次使用 如何 MDB 侦听器端口使用连接池 示例,假定您在应用程序服务器中部署了两个 MDB ,每个 MDB 使用不同的侦听器端口。

每个侦听器端口均配置为使用 jms/CF1 连接工厂,并且您为该连接工厂配置了以下属性值:
  • Unused timeout 属性设置为 120 秒
  • Reap time 属性设置为 180 秒
  • Minimum connections 属性设置为 1

假设第一个侦听器已停止,其连接 c1 已被放入空闲池中。 180 秒后,池维护线程将唤醒,扫描空闲池的内容以查找 jms/CF1,并发现 c1 在空闲池中的时间超过连接工厂的 Unused timeout 属性的值。

但是,在关闭 c1 之前,池维护线程将执行检查来了解在废弃此连接后池中将保留的连接数。 由于 c1 是空闲连接池中的唯一连接,因此连接管理器不会将其关闭,因为这样做会使保留在空闲池中的连接数小于为 Minimum connections设置的值。

现在,假设第二个侦听器已停止。 空闲连接池现在包含两个空闲连接 - c1c2

再过 180 秒之后,池维护线程再次运行。 此时,c1 在空闲连接池中已存在 360 秒,c2 已存在 180 秒。

池维护线程将检查 c1 并发现它在池中的时间超过 Unused timeout 属性的值。

然后,线程将检查空闲池中的连接数,并将其与 Minimum connections 属性的值进行比较。 由于池包含两个连接,并且 Minimum connections 设置为 1 ,因此连接管理器将关闭 c1

维护线程现在会查看 c2。 这在空闲连接池中的时间也超过了 Unused timeout 属性的值。 但是,由于关闭 c2 将使空闲连接池中的连接数少于设置的最小连接数,因此连接管理器将单独保留 c2