如何在WebLogic集群中协调部署在多个服务器上的单个EJB定时器?

6
因此,我有一个Web客户端和一个EJB定时器,它们分别部署。
工作流程如下:
1)用户访问客户端。 2)用户请求进行已知为长时间运行的操作,因此我们将请求写入数据库表以运行此过程。 3)TimerOne每隔几秒钟检查一次此表,以查看是否有任何等待任务,因此找到用户的请求并运行任务。
我的问题是,在我们运行应用程序的某些环境中,我们利用了服务器集群。当我们这样做时,客户端和EJB定时器都部署到群集中的每个服务器上。
客户端部署到多个服务器上可以帮助负载平衡,这没问题;然而,让定时器在多个服务器上运行会产生问题。当用户请求运行长时间运行的任务时,两个定时器同时从数据库中抓取任务并开始运行。由于长时间运行的作业通常要写入数据库,所以这种情况会导致冲突等问题。
我的目标是能够将EJB定时器部署到两个服务器,但要在集群中保持某些状态,定时器可以使用这些状态来决定它们是否应该接取任务,或者其他实例是否已经接取了任务。
我尝试使用数据库和文件存储,但这些方法要么太慢,要么我无法想出一个同步的完美流程。
有人知道如何处理这个问题的好方法吗?是否可能?
解决方案应该能够在集群WebLogic域、非集群WebLogic域、集群Glassfish域和非集群Glassfish域上运行。
如果有其他更优雅的解决方法,我也可以进行更改。
感谢任何想法!
2个回答


0
我愿意改变这种做法,如果有另一种更优雅的解决方案。
我知道你的问题是关于EJB定时器的,但请注意以下几点: 在我看来,您需要异步处理的优势。
在早期的Java EE版本中,实现这种要求的替代方法之一是使用JMS,它允许您发送稍后由业务层组件处理的消息。另一种可能性是您所描述的,需要使用EJB定时器。我认为这两种情况都是填补EE规范中的空白的权宜之计。
自从Java EE 6以来,您可以定义异步服务,它允许您进行异步调用,避免使用被设计用于其他目的的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接