控制在不同服务器上的不同JVM中运行的Batch程序的执行

时间:2014-10-30 06:24:25

标签: java spring oracle tomcat jvm

我有一个批处理程序(程序来插入/更新/查询数据库)计划,使用Java Timer每天触发一次。 此批处理程序在apache tomcat中的两个不同服务器中运行。

现在我的问题是Java Timer API在两台服务器中并行触发作业,因此我的程序执行两次,因此我获得了相同的记录处理两次,使用不同的主键。

我需要确保我的程序只触发一次,触发应该动态发生而不管服务器。 一旦启动一个Batch,其他人就不应该开始或其他不应该被处理。

下面, Tomcat托管在两台服务器中,每台服务器都部署了相同的应用程序 我有一个由两个服务器共享的数据库。

使用Java和spring。

在上述问题的解决方案中需要建议/帮助。

1 个答案:

答案 0 :(得分:0)

使用支持在群集环境中运行作业的作业调度库,如Quartz Quartz能够确保一个节点只运行作业,从而防止重复执行作业。您可以阅读有关此here的更多信息 Spring使用TaskExecutor和TaskScheduler接口为异步执行和任务调度提供抽象。 Spring还提供了使用Quartz Scheduler支持调度的集成类。有关详细信息,请查看here

如果您希望继续使用Java计时器,则必须自己处理同步。 commons解决方案是使用共享锁数据库表。当2个节点同时尝试从锁定表读取/写入时,您必须小心不要遇到并发问题。