0

我有一个关于使用 EJB 定时器服务的场景要问。

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

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

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

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

这是一个好主意吗?

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

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

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

有什么想法吗?

4

1 回答 1

3

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

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

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

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

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