使用EJB Timer Service执行外部服务

时间:2012-10-22 02:11:10

标签: java ejb-3.0 svnkit

我有一个关于利用EJB Timer Service的方案。

用例如下: 系统应该能够安排一个任务,该任务将使用某个特定时间戳轮询/询问我们的subversion存储库以查找文件更改。

这个想法是每当计划任务即将运行时,它将对特定的svn存储库执行命令。 出于这个特殊目的,我不会调用任何外部进程,而是使用'纯'java方式使用SVNKit java库http://svnkit.com/

我唯一担心的是: 使用EJB Timer Service执行将调用外部进程的任务是一个好主意吗?我的方式将使用'纯'java方式,但在其他方案中,例如直接调用批处理文件/命令行/外部可执行文件到计时器服务逻辑。

我担心服务器内存使用/性能等的影响。

这是个好主意吗?

我想的另一个想法就是在服务器中使用基于客户端的技术创建一个“桌面”应用程序,例如SWT / Swing,它将进行轮询,然后在那里编写逻辑,但这意味着我需要管理两个应用程序将进行民意调查的“桌面”应用和我将在Glassfish中创建的“网络”用户界面。

我倾向于在我选择的应用服务器中做所有的事情,即glassfish。

之前我使用过EJB Timer但它只调用了数据库而没有调用任何外部服务而只是出现了这种情况所以我在这里提出了一个问题,以便从经验丰富的人那里收集更多的想法。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

理论上,EJB不应该依赖于外部I / O,因为它会干扰容器/服务器对bean实例,线程等的管理。

在实践中,如果采取预防措施,这应该有效。例如:

  • 将函数隔离到自己的EJB(即只处理这些计时器的无状态会话bean)以避免实例池问题
  • 在等待命令时使用超时以避免挂起的进程挂起所有服务器线程
  • 确保您不安排计时器,以便同时运行多个操作系统命令

请记住,EJB 3.0计时器是持久的(与EJB 3.1计时器相比,它可以选择非持久性),这意味着:

  1. 它们可以在群集中的任何服务器上运行。如果群集中有多台计算机,则需要确保它们都能够运行该命令。
  2. 他们在服务器重启后幸存下来。如果您计划运行计时器但服务器崩溃,它将在服务器重新启动时运行。这可能会导致间隔计时器出现特殊问题(所有错过的计时器将反复触发),如果您不仔细管理现有时间(您可以轻松创建冗余计时器)。