java - 如何在运行时管理 Quartz 作业的集群模式?

标签 java spring quartz-scheduler

我正在集群模式下运行 Quartz 作业。这是我的配置。是否可以更改作业运行时的节点(JMX RMI)?

例如我的服务器有 2 个节点。第一个太忙了,所以我需要换工作到第二个。

<property name="quartzProperties">
    <props>
        <prop key="org.quartz.scheduler.instanceName">myApp</prop>
        <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
        <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
        <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
        <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
        <prop key="org.quartz.jobStore.tablePrefix">q</prop>
        <prop key="org.quartz.jobStore.isClustered">true</prop>
        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
        <prop key="org.quartz.threadPool.threadCount">5</prop>
        <prop key="org.quartz.threadPool.threadPriority">5</prop>
        <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
        <prop key="org.quartz.scheduler.jmx.export">true</prop>
        <prop key="org.quartz.scheduler.jmx.objectName">quartz:type=QuartzScheduler,name=JmxScheduler,instanceId=NONE_CLUSTER</prop>
    </props>

最佳答案

不直接。我不认为选择作业运行的服务器是 Quartz 标准版本的一部分。可用于 Quartz Scheduler Where .

如果您想继续使用 RMI,您可能可以编写一个程序,根据条件逻辑关闭集群中的调度程序之一(如果禁用该作业,它将阻止将来在所有服务器上执行)。来自 the manual :

When using Quartz via RMI, you need to start an instance of Quartz with it configured to "export" its services via RMI. You then create clients to the server by configuring a Quartz scheduler to "proxy" its work to the server.

要打开 RMI:

<prop key="org.quartz.scheduler.rmi.export">true</prop>

This page from O'Reilly详细描述了整个过程,并展示了从客户端管理远程实例的示例。修改他们的示例以关闭调度程序。

如果您愿意接受现成的解决方案,MySchedule project是一个基于 Web 的 UI,用于管理 Quartz。它能够管理远程实例。

另一种方法是在 Quartz 之外管理同步。允许作业在所有节点上触发,但在作业中使用您自己的逻辑来确定当前节点是否应该实际执行任何处理。您可以使用 JGroups 或类似的库在节点之间传递负载信息。

最后,您是否认为 Quartz 可能不是适合这项工作的工具?听起来分布式队列可能比较合适。例如,一组竞争客户端在处理工作项时尽快从队列中提取工作项。

关于java - 如何在运行时管理 Quartz 作业的集群模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037756/

相关文章:

java - 如何在 PLSQL/SQL 中查找存储为 varchar2 的两个日期之间的差异(以秒为单位)

java - 保存 ModelAttribute 时出现空指针异常 [Spring MVC]

java - Quartz Cron 表达式问题

java - 嵌套 IF 语句

java - 如何知道 Android Studio 中输入的字母是否为大写?

java - OptimisticLocking 和@OneToMany(mappedBy=...) 处理?

java - Spring引导与CalendarIntervalTrigger程序

mysql - Spring 与 hibernate Post 不工作

java - spring data mongodb调用save两次导致重复键异常

java - Spring调度程序关闭错误