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

Java 使用EJB定时器服务执行外部服务,java,ejb-3.0,svnkit,Java,Ejb 3.0,Svnkit,我有一个关于利用EJB定时器服务的场景要问 用例如下所示: 系统应该能够安排一项任务,使用特定的时间戳轮询/询问subversion存储库中的文件更改 其思想是,每当计划任务即将运行时,它都会针对特定的svn存储库执行命令。 为此,我将不调用任何外部进程,而是使用“纯”java方式使用SVNKit java库 我唯一关心的是: 使用EJB定时器服务来执行将调用外部进程的任务是一个好主意吗?我的方式将使用“纯”java方式,但在其他场景中,如直接将批处理文件/命令行/外部可执行文件调用到计时器服务

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

用例如下所示: 系统应该能够安排一项任务,使用特定的时间戳轮询/询问subversion存储库中的文件更改

其思想是,每当计划任务即将运行时,它都会针对特定的svn存储库执行命令。 为此,我将不调用任何外部进程,而是使用“纯”java方式使用SVNKit java库

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

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

这是个好主意吗

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

我倾向于在我选择的glassfish应用服务器上做任何事情

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


有什么想法吗?

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

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

  • 将函数隔离到自己的EJB(即,只处理这些计时器的无状态会话bean)以避免实例池问题
  • 在等待命令时使用超时,以避免挂起的进程挂起所有服务器线程
  • 确保不安排计时器,以便同时运行多个操作系统命令
请记住,EJB3.0计时器是持久的(与EJB3.1计时器相比,EJB3.1计时器具有非持久性选项),这意味着:

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

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

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

    • 将函数隔离到自己的EJB(即,只处理这些计时器的无状态会话bean)以避免实例池问题
    • 在等待命令时使用超时,以避免挂起的进程挂起所有服务器线程
    • 确保不安排计时器,以便同时运行多个操作系统命令
    请记住,EJB3.0计时器是持久的(与EJB3.1计时器相比,EJB3.1计时器具有非持久性选项),这意味着:

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

  • 我一直在用桌面应用程序实现第二个aprouch,并安排了一个任务,使用jms发送消息。原因是桌面应用程序将在连接的客户端上运行。这很好,我遇到的问题是关于客户端应用程序的部署,这本身就是一个领域。因此,如果你永远不需要在另一台机器上运行,我认为不值得花那么多钱用桌面应用程序实现第二个aprouch,让一个预定的任务使用jms发送消息。原因是桌面应用程序将在连接的客户端上运行。这很好,我遇到的问题是关于客户端应用程序的部署,这本身就是一个领域。因此,如果你永远不会有在不同的机器上运行的要求,我认为这是不值得的科斯蒂优秀的想法。另一方面,创建一个单例EJB和@Startup加上调度表达式会解决上面提到的问题吗?我在想,既然它是单例的,并且会在部署期间触发,那么我就能够解决您上面提到的问题。感谢您使用了ejb-3.0标记(vs ejb-3.1),所以我不知道您是否可以使用EJB3.1特性。是的,使用
    @Singleton
    解决了许多问题,如果您使用
    @Schedule(persistent=false)
    (显然带有时间属性),您甚至不需要
    @Startup
    。谢谢。。。实际上我什么都能用。。至于EJB3.0或EJB3.1,我不确定这一点,因为我还是一个学习EJB的人。但多亏了你的想法,我将利用@Singleton注释加上删除启动的时间表。嗨,好主意。另一方面,创建一个单例EJB和@Startup加上调度表达式会解决上面提到的问题吗?我在想,既然它是单例的,而且会在部署期间开火