【问题标题】:quartz scheduler clustering石英调度器集群
【发布时间】:2012-06-11 16:01:26
【问题描述】:

我有一个 2 节点 HA 服务器。节点 1 处于活动状态,节点 2 处于备用状态。

我做了一个应用程序并使用quartz api进行聚类。我已经在数据库中制作了所有表。

现在我是否需要在两个节点或 jst 节点 1 中运行该模块,以便当节点 1 关闭时,应用程序会自动在节点 2 中启动。

在两个节点上运行模块时,触发器和作业名称应该相同还是不同?

石英属性:

org.quartz.threadPool.class= org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 10

org.quartz.threadPool.threadPriority = 5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

-- 使用 RAMJobStore

--如果使用RAMJobStore,请务必注释掉

-- org.quartz.jobStore.tablePrefix, org.quartz.jobStore.driverDelegateClass, org.quartz.jobStore.dataSource

-org.quartz.jobStore.class= org.quartz.simpl.RAMJobStore

-- 使用 JobStoreTX

-- 确保首先运行适当的脚本(在 docs/dbTables 下)来创建数据库/表

org.quartz.jobStore.class= org.quartz.impl.jdbcjobstore.JobStoreTX

-- 使用 DriverDelegate

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

--新的集群配置

org.quartz.jobStore.isClustered = true

org.quartz.jobStore.clusterCheckinInterval = 20000

org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.instanceName = MyClusteredScheduler

-- 使用表前缀配置 JDBCJobStore

org.quartz.jobStore.tablePrefix = QRTZ_

-- 使用数据源

org.quartz.jobStore.dataSource = qzDS

-- 定义要使用的数据源

org.quartz.dataSource.qzDS.driver = oracle.jdbc.driver.OracleDriver

org.quartz.dataSource.qzDS.URL = jdbc:oracle:thin:@10.172.16.147:1521:emadb0

org.quartz.dataSource.qzDS.user = BLuser

org.quartz.dataSource.qzDS.password = BLuser

org.quartz.dataSource.qzDS.maxConnections = 30

-----------

【问题讨论】:

    标签: quartz-scheduler


    【解决方案1】:

    根据: http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

    特别是:

    集群目前仅适用于 JDBC-Jobstore(JobStoreTX 或 JobStoreCMT),本质上是通过让集群的每个节点共享同一个数据库来实现的。

    负载平衡会自动发生,集群的每个节点都会尽快触发作业。当触发器的触发时间发生时,第一个获取它的节点(通过对其加锁)就是将触发它的节点。

    你应该启动所有节点,最快的会触发作业,其他人会知道。

    【讨论】:

    • 但是当我在两个节点上运行时。在第二个节点上出现错误:Unable to store Job with name: 'JOB215na2duosopsg4ddnoZ3s7sd97432918768' and group: 'DEFAULT', because one already exists with this identification.
    • 试试这个代码: if (sched.checkExists(job.getKey())) {sched.rescheduleJob(trigger.getKey(), trigger); } else {sched.scheduleJob(作业,触发器); }
    • 实际上我想要的是在集群服务器的两个节点上运行相同的作业。一个进程应该同时处于活动状态。如果主动进程死亡,被动进程应该变为主动。所以到目前为止我已经把 {sched.scheduleJob(job, trigger); } 在尝试捕获。因此,如果它安排一次,则不安排作业。那么这看起来还可以吗?
    • 我了解您一次只希望一个节点触发作业,另一个节点只有在第一个节点出现故障时才会处于活动状态。我在评论中给你的 sn-p 将允许第二个节点安排作业,即使第一个节点已经定义了它。自己试试吧!
    • 好的,现在我可以在一个节点中以主动方式启动作业,而在其他节点中以被动方式启动作业。如果主动作业死亡,被动作业将变为主动作业。但是现在我的问题是,如果作业因为服务器停止而死亡,那么当服务器启动时它会出现吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多