gpt4 book ai didi

java - 使用 EJB 定时器服务执行外部服务

转载 作者:行者123 更新时间:2023-12-02 00:10:12 24 4
gpt4 key购买 nike

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

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

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

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

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

这是个好主意吗?

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

我倾向于在我选择的应用程序服务器 glassfish 中完成所有操作。

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

有什么想法吗?

最佳答案

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

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

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

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

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

关于java - 使用 EJB 定时器服务执行外部服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com