当前位置: 首页 > 面试题库 >

Quartz 2.2多调度程序和@DisallowConcurrentExecution

曾飞沉
2023-03-14
问题内容

请考虑这个例子。

一个示例Web应用程序要求scheduler.start()其启动。调度程序配置为将其作业存储在DB中。

应用程序被复制到六个Web服务器上。

因此,如果我们启动六个Web服务器,则在单个DB上将有六个具有相同名称的调度程序。如https://quartz-
scheduler.org/documentation/quartz-2.1.x/cookbook/MultipleSchedulers中所述

切勿针对运行(start()ed)具有相同调度程序名称的任何其他实例的数据库表集启动非集群实例(scheduler.start())。您可能会遇到严重的数据损坏,并且肯定会遇到不稳定的行为。

因此,这将失败。

我的问题是,如果我确定我所有的工作@DisallowConcurrentExecution都会胜任工作,否则仍然失败?

如果@DisallowConcurrentExecution没有帮助,我应该手动将一台服务器配置为某些主机

public class StartUp implements ServletContextListener {

   public void contextInitialized(ServletContextEvent event) {
       if(THIS_IS_MASTER_TOMCAT){
         scheduler.start()
       }
}

有更好的方法吗?


问题答案:

基本上Rene M.是正确的。这是与Quartz有关的文档:

http://www.quartz-
scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering.html

现在介绍一些我们自己在公司使用的背景和概念性示例。我们
Wildfly群集中使用石英群集模式。也就是说,每个Wildfly群集节点都运行石英。由于quartz本身以群集模式运行,并且指向相同的数据库模式,因此我们保证每个
群集 运行一个作业。同样,请参阅文档。关键问题是:

  1. 单个石英群集必须针对单个石英数据库
    架构运行。显然,您必须根据文档创建关系数据库表。没关系

  2. 您必须正确设置quartz.property文件,并且群集中的每个节点都必须存在一个副本。 完全相同的quartz.property文件

  3. 最后,您必须使用NonJTA数据源,否则石英群集将失败。这通常意味着在Wildfly世界中,石英将需要其自己的数据源。

石英石属性示例:

    #============================================================================
# Configure Main Scheduler Properties 
#============================================================================

org.quartz.scheduler.instanceName = BjondScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool 
#============================================================================

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

#============================================================================
# Configure JobStore 
#============================================================================

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 5000

org.quartz.scheduler.wrapJobExecutionInUserTransaction = true
org.quartz.scheduler.userTransactionURL = java:jboss/UserTransaction

org.quartz.jobStore.dataSource = PostgreSQLDS
org.quartz.jobStore.nonManagedTXDataSource = PostgreSQLDSNoJTA

org.quartz.dataSource.PostgreSQLDSNoJTA.jndiURL=java:jboss/datasources/PostgreSQLDSNoJTA
org.quartz.dataSource.PostgreSQLDS.jndiURL=java:jboss/datasources/PostgreSQLDS


#============================================================================
# Configure Logging
#============================================================================
#org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
#org.quartz.plugin.jobHistory.jobToBeFiredMessage=Bjond Job [{1}.{0}] to be fired by trigger [{4}.{3}] at: {2, date, HH:mm:ss MM/dd/yyyy} re-fire count: {7}
#org.quartz.plugin.jobHistory.jobSuccessMessage=Bjond Job [{1}.{0}] execution complete and reports: {8}
#org.quartz.plugin.jobHistory.jobFailedMessage=Bjond Job [{1}.{0}] execution failed with exception: {8}
#org.quartz.plugin.jobHistory.jobWasVetoedMessage=Bjond Job [{1}.{0}] was vetoed. It was to be fired by trigger [{4}.{3}] at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}

现在,standalone.xml中的数据源代码段:

            <datasource jta="false" jndi-name="java:jboss/datasources/PostgreSQLDSNoJTA" pool-name="PostgreSQLDSNoJTA" enabled="true" use-java-context="true" use-ccm="true">

您可以根据需要填写此数据源元素的其余部分。@DisallowConcurrentExecution是一个好主意,它可以防止单个节点上的多个作业执行特定的方法,但是石英集群阻止了同一作业在多个VM上运行。不是这个注释。



 类似资料:
  • 我使用RxJava2 Android网络的网络调用。我面临的问题是,当我试图通过命中API时,有时它不会给出任何响应,而当我试图通过命中API时,它总是给出回应 和

  • 我正在做一个项目,我们计划使用WLP (WebSphere liberty)代替传统的WAS。 代码使用 WAS 调度程序来调度活动。 liberty 是否也具有与 WAS 中存在的相同级别的调度程序支持/功能? 如何将调度程序任务从webphere迁移到自由?

  • 假设我有一个间隔,我给了它一个计算调度器。这样地: 那么,平面图{...}中发生的一切是否也会被调度在计算线程上? 在Observable.interval的源代码中,它说: 作为RxJava的初学者,我很难理解这个评论。我知道间隔计时器/等待逻辑发生在计算线程上。但是,关于要发出的项目的最后一部分是否也意味着发出的项目将在同一个线程上使用?还是需要观察?这样地: 如果我想在计算线程上处理emit

  • 问题内容: 到目前为止,我以前一直认为Web应用程序只能具有我们在 我这样想对吗? 我可以在一个Web应用程序中拥有多个调度程序Servlet吗?如果是,如何? 在什么情况下我们可能需要这样做? 整个Web应用程序中只能有一个应用程序上下文吗? 我们如何定义多个应用程序上下文? 非Spring应用程序中可以存在吗? 问题答案: 一个Web应用程序中可以有多个调度程序servlet吗? Web应用程

  • 主要内容:1. 串行调度,2. 非串行调度从一个事务到另一个事务的一系列操作称为调度。 它用于保存每个单独事务中的操作顺序。 1. 串行调度 串行调度是一种调度,其中一个事务在开始另一个事务之前完全执行。 在串行调度中,当第一个事务完成其循环时,则执行下一个事务。 例如: 假设有两个事务和有一些操作。 如果它没有交错操作,那么有以下两种可能的结果: 执行的所有操作,然后执行的所有操作。 在给定的(b)图中,调度A显示了序列调度,其中之后跟

  • 请考虑这个例子。 示例web应用程序在启动时调用。配置为将其作业存储在DB中的计划程序。 该应用程序被复制到六个Web服务器上。 还有更好的方法吗?!