繁体   English   中英

使用EJB Timer Service执行外部服务

[英]Executing external services using EJB Timer Service

我有一个关于利用EJB计时器服务的场景。

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

这个想法是,每当计划任务要运行时,它将针对特定的svn存储库执行命令。 为此,我不会调用任何外部进程,而是使用“纯” java方式来使用SVNKit Java库http://svnkit.com/

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

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

这是一个好主意吗?

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

我倾向于在我选择的应用服务器(glassfish)中执行所有操作。

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

有什么想法吗?

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

在实践中,如果采取预防措施,这应该会起作用。 例如:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM