如何协调部署到WebLogic群集中多个服务器的单个ejb计时器?

时间:2014-01-29 20:10:12

标签: java java-ee glassfish ejb weblogic

所以,我有一个Web客户端和一个EJB计时器,单独部署。

工作流程如下:

1)用户访问客户端。 2)用户请求发生已知长时间运行的操作,因此我们在数据库表中编写运行此进程的请求。 3)TimerOne每隔几秒检查一次这个表,看是否有任何等待任务,所以它找到用户的请求并运行任务。

我的问题是,在运行我们的应用程序的某些环境中,我们正在利用服务器群集。当我们这样做时,客户端和EJB计时器都部署到集群中的每个服务器。

将客户端部署到多个服务器是可以的,因为它有助于工作负载;但是,让计时器在多个服务器上运行是一个问题。当用户请求运行长时间运行的任务时,两个计时器同时从数据库中获取任务并开始运行它。由于长时间运行的作业通常会写入数据库,因此这种情况会导致冲突等问题。

我的目标是能够将我的EJB计时器部署到两个服务器,但是要在整个集群中维护一些状态,计时器可以使用它来决定是否应该接收任务,或者是否其他实例已经把它搞定了。

我尝试使用数据库进行此操作并尝试了文件存储,但这些要么太慢,要么我无法提供防弹工作流程来进行同步。

有谁知道处理这个问题的好方法?它甚至可能吗?

该解决方案应该能够在集群WebLogic域,非集群WebLogic域,集群Glassfish域和非集群Glassfish域上运行。

如果有另一种更加优雅的解决方案,我愿意改变这种方式。

感谢您的任何想法!

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

  

如果有另一种更加优雅的解决方案,我愿意改变这种方式。

我知道您的问题是关于EJB Timer,但请注意以下几点: 在我看来,您需要具备异步处理的优势。

在早期的Java EE版本中,实现此类要求的替代方法之一是使用JMS,它允许您发送稍后为业务层组件处理的消息。其他可能性是您所描述的,需要使用EJB Timer。我认为这两种情况都是一种解决方案,填补了EE规范的空白。

从Java EE 6开始,您可以定义asynchronous services,它允许您进行异步调用,避免使用功能被认为是出于其他目的。