编程语言
首页 > 编程语言> > Java-Quartz 2.2多调度程序和@DisallowConcurrentExecution

Java-Quartz 2.2多调度程序和@DisallowConcurrentExecution

作者:互联网

请考虑这个例子.

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

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

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

Never start (scheduler.start()) a non-clustered instance against the same set of database tables that any other instance with the same scheduler name is running (start()ed) against. You may get serious data corruption, and will definitely experience erratic behavior.

因此,这将失败.

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

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

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群集中使用石英群集模式.也就是说,每个野生蝇群集节点都运行石英.由于quartz本身以群集模式运行,并且指向相同的数据库模式,因此我们保证每个群集运行一个作业.同样,请参阅文档.关键问题是:

>单个石英群集必须针对单个石英数据库运行
模式.显然,您必须每个创建关系数据库表
文档.没关系
>您必须设置quartz.property文件
正确,并且副本中必须存在每个节点的副本
簇.完全相同的quartz.property文件
>最后,您必须使用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上运行;不是这个注释.

标签:quartz-scheduler,java
来源: https://codeday.me/bug/20191027/1943935.html