计时器服务的集群环境注意事项
在单一服务器环境中,很清楚哪个服务器实例应该调用给定 Bean 上的 Bean 超时方法。 在多服务器的集群环境中,存在其他有关治理行为的注意事项。
WebSphere® Application Server 实现 Enterprise JavaBeans (EJB) 计时器服务。 根据您的业务需要,可以使用持久性计时器或非持久性计时器。如果正在为基于时间的事件创建计时器,该事件要求确保计时器在超过服务器的生命周期后仍然存在(在服务器关闭并重新启动时仍然存在),那么持久性计时器非常有用。 先前启动的持久性计时器在服务器启动时会自动启动,并且需要数据库实例。非持久性计时器不使用数据存储器,并且当应用程序服务器停止或未能保持活动状态时会被取消。非持久性计时器只存在于创建他们的服务器上。在集群环境中,如果您的 EJB 应用程序自动创建非持久性计时器,并且此应用程序镜像到多个服务器上,那么每个服务器包含运行在该服务器环境中的本身的非持久性计时器。以编程方式创建的非持久性计时器仅在其中创建它的集群成员中运行。
当在多服务器集群服务器环境中配置持久性计时器时,请参考服务器实例以下可能性来调用给定 Bean 上超时方法:
- 每个服务器进程或集群成员单独的定时服务数据库。这是缺省配置。只有创建计时器的服务器实例或集群成员可以访问计时器并运行 Bean 的超时方法。如果服务器实例不可用,那么在特定时间,该计时器不会运行,并且直到重新启动该服务器后计时器才会运行。同样,如果企业 Bean 调用 getTimers() 方法,那么只找到在服务器实例上创建的那些计时器。如果企业 Bean 尝试取消与其关联的所有计时器,那么这会引起意外行为;例如,当移除企业 Bean 时。对于产品级别的系统,不推荐使用此配置。
- 集群的共享或公共定时服务数据库。可以在任何服务器进程或集群成员上创建和访问计时器。通过 getTimers() 方法在集群中的其他服务器进程上找到了服务器进程创建的计时器。当移除实体 bean时,取消所有计时器(不管这些计时器是在哪里创建的)。但是,在集群中的单个服务器上执行所有计时器,就是说为单个服务器上的所有计时器运行 Bean 的超时方法。 哪个服务器执行计时器是不同的,这取决于哪个服务器进程获得对公共数据库表的锁定。如果执行计时器的服务器变得不可用,那么另一个服务器或集群成员接替该服务器并开始按所有计时器的预定时间执行它们。对于所有产品级别的系统,这是建议的配置。
- 要避免发生该问题,使用 wsPessimisticUpdate 访问意向。此访问意向使应用程序中的 finder 方法运行 select for update 语句而不是一般选择。当多个线程都尝试升级其锁定以执行更新时这会预防锁定升级为死锁。
避免故障: 但在使用多线程数据库访问的应用程序中使用 EJB 计时器服务时,应用程序流程可能出现死锁问题。gotcha
请参阅关于使用企业 Bean 的 EJB 计时器服务的信息,以了解如何为每个服务器进程计时器服务配置要使用的数据源(数据库)。
避免故障: 一旦将计时器服务的数据源更改为指向不同数据库,那么当下一服务器启动时,服务器进程自动尝试在该数据库创建需要的表。gotcha
如果未授权与服务器进程启动关联的用户标识来创建配置的计时器服务数据库中的数据库表,那么必须手动创建这些表。


