如何安排在不同调度程序实例中创建的作业

我正在使用spring-boot-starter-quartz 2.2.1.RELEASE来调度Quartz作业,并将代码部署在两个节点上。 而quartz.properties就像这样:

对于节点一:

org.quartz.scheduler.instanceName: machine1
org.quartz.scheduler.instanceId = AUTO

对于第二个节点:

org.quartz.scheduler.instanceName: machine2
org.quartz.scheduler.instanceId = AUTO

因此,在这种情况下,每个节点可以分别运行相同的扫描作业。 现在在我的数据库“ qrtz_job_details”中,我可以有两个作业记录,即scanJobbyMachine1和scanJobbyMachine2。

我还在node1上部署了一个具有RESTful API的前端UI,用于调度作业。然后我使用nginx将请求随机发送到我的一个节点。

如果我请求查询所有作业,则该请求可能会发送到node1,并且仅显示node1的作业。但是我想同时显示node1和node2的工作。

如果我请求更新scanJobbyMachine1,它可能会发送到node2。而且无法进行更新,因为node2仅具有instanceName为machine2的属性文件。

这是我的计划:

计划A:使用群集模式。但是Quartz还不支持“允许将作业执行固定到集群节点”。因此,在群集模式下,我的工作只会被一个节点执行。但是我希望两个节点都执行扫描作业。 here is the issue link in github

计划B:使用非群集模式。然后,我必须像这样在Controller中编写重复的API:

localhost:8090/machine0/updateJob
localhost:8090/machine1/updateJob

并在请求/ machine0 / updateJob时使用nginx进行设置,将其发送到10.110.200.60(machine1的ip),当我请求/ machine1 / updateJob时,将其发送到10.110.200.62(machine2的ip)

对于queryAllJobs,我必须使用后端将请求发送到10.110.200.60和10.110.200.62,然后将响应列表合并到后端,然后在前端显示。

计划C:用两个属性文件编写另一个后端。只是为了安排工作,而不是执行这些工作(我不知道这是否可行)并在这两个节点上进行部署。

我真的不想写和部署另一个后端,例如Plan C或编写重复的API,例如PlanB。 有什么好主意吗?

yanyantianlong 回答:如何安排在不同调度程序实例中创建的作业

您的问题是一个集群问题:)

也许您可以动态配置作业注册:当node1启动时,它将在群集上单独运行,并且仅在此节点上运行作业。在node2启动时,可以调用两个节点。

本文链接:https://www.f2er.com/3010092.html

大家都在问