Java 使用EJB定时器服务执行外部服务
我有一个关于利用EJB定时器服务的场景要问 用例如下所示: 系统应该能够安排一项任务,使用特定的时间戳轮询/询问subversion存储库中的文件更改 其思想是,每当计划任务即将运行时,它都会针对特定的svn存储库执行命令。 为此,我将不调用任何外部进程,而是使用“纯”java方式使用SVNKit java库 我唯一关心的是: 使用EJB定时器服务来执行将调用外部进程的任务是一个好主意吗?我的方式将使用“纯”java方式,但在其他场景中,如直接将批处理文件/命令行/外部可执行文件调用到计时器服务逻辑中 我担心服务器内存使用/性能等的影响 这是个好主意吗 我想的另一个想法是使用基于客户端的技术(如SWT/Swing)在服务器上创建一个“桌面”应用程序,该技术将进行轮询,然后在那里编写逻辑代码,但这意味着我需要管理两个应用程序。将轮询的“桌面”应用程序和我将在Glassfish中创建的“web”用户界面 我倾向于在我选择的glassfish应用服务器上做任何事情 我以前使用过EJB定时器,但它只调用数据库而不调用任何扩展服务,只是出现了这种情况,所以我在这里提出了一个问题,以收集经验丰富的人员的更多想法Java 使用EJB定时器服务执行外部服务,java,ejb-3.0,svnkit,Java,Ejb 3.0,Svnkit,我有一个关于利用EJB定时器服务的场景要问 用例如下所示: 系统应该能够安排一项任务,使用特定的时间戳轮询/询问subversion存储库中的文件更改 其思想是,每当计划任务即将运行时,它都会针对特定的svn存储库执行命令。 为此,我将不调用任何外部进程,而是使用“纯”java方式使用SVNKit java库 我唯一关心的是: 使用EJB定时器服务来执行将调用外部进程的任务是一个好主意吗?我的方式将使用“纯”java方式,但在其他场景中,如直接将批处理文件/命令行/外部可执行文件调用到计时器服务
有什么想法吗?理论上,EJB不应该依赖于外部I/O,因为它会干扰容器/服务器对bean实例、线程等的管理 在实践中,如果你采取预防措施,这应该是有效的。例如:
- 将函数隔离到自己的EJB(即,只处理这些计时器的无状态会话bean)以避免实例池问题
- 在等待命令时使用超时,以避免挂起的进程挂起所有服务器线程
- 确保不安排计时器,以便同时运行多个操作系统命令
理论上,EJB不应该依赖于外部I/O,因为它会干扰容器/服务器对bean实例、线程等的管理 在实践中,如果你采取预防措施,这应该是有效的。例如:
- 将函数隔离到自己的EJB(即,只处理这些计时器的无状态会话bean)以避免实例池问题
- 在等待命令时使用超时,以避免挂起的进程挂起所有服务器线程
- 确保不安排计时器,以便同时运行多个操作系统命令
我一直在用桌面应用程序实现第二个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加上调度表达式会解决上面提到的问题吗?我在想,既然它是单例的,而且会在部署期间开火