池维护线程示例
使用 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/CF1的 Unused timeout 属性的值。 因此,维护线程不对该连接进行处理。
再过 180 秒之后,池维护线程再次运行。 维护线程会找到连接 c1,并确定该连接已在池中 360 秒,这比设置的 Unused timeout 值长,因此连接管理器会关闭该连接。
如果现在再次运行 sendMessage() 方法,那么当应用程序调用 connectionFactory.createConnection() 时,连接管理器将创建到 IBM® MQ 的新连接,因为连接工厂的可用连接池为空。
上述示例显示了当 Aged timeout 属性设置为零时,维护线程如何使用 Reap time 和 Unused 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设置的值。
现在,假设第二个侦听器已停止。 空闲连接池现在包含两个空闲连接 - c1 和 c2。
再过 180 秒之后,池维护线程再次运行。 此时,c1 在空闲连接池中已存在 360 秒,c2 已存在 180 秒。
池维护线程将检查 c1 并发现它在池中的时间超过 Unused timeout 属性的值。
然后,线程将检查空闲池中的连接数,并将其与 Minimum connections 属性的值进行比较。 由于池包含两个连接,并且 Minimum connections 设置为 1 ,因此连接管理器将关闭 c1。
维护线程现在会查看 c2。 这在空闲连接池中的时间也超过了 Unused timeout 属性的值。 但是,由于关闭 c2 将使空闲连接池中的连接数少于设置的最小连接数,因此连接管理器将单独保留 c2 。