gpt4 book ai didi

Grails 集群 quartz 作业示例代码和所需的配置

转载 作者:行者123 更新时间:2023-12-04 06:08:43 25 4
gpt4 key购买 nike

我在 Grails 1.3.7 中使用 quartz 插件。我需要对使用 quartz 作业的服务器应用程序进行负载平衡/集群。显然这是支持的,但我发现文档中的所有谷歌搜索结果和链接都已损坏。我找到了一些原始的 Java 示例,但我认为 Grails 有一种更简单的方法来做到这一点。我所需要的只是一个用作模板的简单示例。我知道我需要以某种方式使 quartz 能够使用 JDBC 来存储作业和管理锁定。

我认为指向单个样本的链接就可以了。但实际上,每次我发现一些看起来很有希望的东西时,它都会指向 terracotta 网站上的一个断开的链接。几乎每个网站最终都会把我带到这里:http://www.opensymphony.com/quartz/wikidocs/TutorialLesson9.html但是当我查看 terracotta 的网站时,我看到的是 Java 的东西,但没有 grails。如果 Java 是唯一的方法,那么就这样吧,但我觉得必须有一些关于这方面的 grails 专业知识!

TIA。

最佳答案

要在 Grails 中集群 Quartz 插件,您需要在项目中包含一些文件。首先,安装grails-app/conf/QuartzConfig.groovy并确保 jdbcStore已启用。

quartz {
autoStartup = true
jdbcStore = true
waitForJobsToCompleteOnShutdown = true
}

接下来,安装与您将连接的数据库相关的 Hibernate 配置文件。例如,对于 Oracle,位于 grails-app/conf/hibernate/hibernate.cfg.xml 的基本 Hibernate xml 配置是:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
'-//Hibernate/Hibernate Configuration DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'>

<hibernate-configuration>

<session-factory>
<mapping resource="Quartz.oracle.hbm.xml"/>
</session-factory>

</hibernate-configuration>

本示例的实际 Quartz-Hibernate SQL 文件将命名为 Quartz.oracle.hbm.xml并将驻留在同一目录中。这些文件应该可以在 GitHub ( https://github.com/nebolsin/grails-quartz ) 上的 Quartz 插件中找到,位于 src/templates/sql 下。 .请注意,这些脚本似乎只适用于数据源 createcreate-drop ,因此您需要在 update 上手动创建 Quartz 表。 ,如果它们在之前的运行中不存在。

创建一个 grails-app/conf/quartz/quartz.properties文件,编辑是为了满足您的业务需求:
/* Have the scheduler id automatically generated for
* all schedulers in a cluster */
org.quartz.scheduler.instanceId = AUTO
/* Don't let Quartz "Phone Home" to see if new versions
* are available */
org.quartz.scheduler.skipUpdateCheck = true

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
/* Configure Quartz for only one thread as the only job
* should run once per day */
org.quartz.threadPool.threadCount = 4
/* Give the thread a Thread.MIN_PRIORITY level*/
org.quartz.threadPool.threadPriority = 1

/* Allow a minute (60,000 ms) of non-firing to pass before
* a trigger is called a misfire */
org.quartz.jobStore.misfireThreshold = 60000
/* Handle only 2 misfired triggers at a time */
org.quartz.jobStore.maxMisfiresToHandleAtATime = 2
/* Check in with the cluster every 5000 ms*/
org.quartz.jobStore.clusterCheckinInterval = 5000

/* Use the Oracle Quartz Driver to communicate via JDBC */
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
/* Have Quartz handle its own transactions with the database */
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

/* Define the prefix for the Quartz tables in the database*/
org.quartz.jobStore.tablePrefix = QRTZ_
/* Tell Quartz it is clustered */
org.quartz.jobStore.isClustered = true
/* Tell Quartz that properties passed to the job call are
* NOT all String objects */
org.quartz.jobStore.useProperties = false

/* Detect the jvm shutdown and call shutdown on the scheduler */
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

/* Log the history of triggers and jobs */
org.quartz.plugin.triggerHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.jobHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

注意以上属性,可以设置 org.quartz.pluginsConfig.groovy 的 Log4j 设置中记录相关作业并触发触发信息。我想 info水平应该够了。

编辑或创建 scripts/_Events.groovy并添加以下 war 修改关闭。这修复了一个已知的 Quartz 插件错误以安装正确的 quartz.properties ,而不是插件中的空白文件,进入最终的 war 文件。
eventCreateWarStart = { warName, stagingDir ->
// Make sure we have the correct quartz.properties in the
// correct place in the war to enable clustering
ant.delete(dir:"${stagingDir}/WEB-INF/classes/quartz")
ant.copy(file:"${basedir}/grails-app/conf/quartz/quartz.properties",
todir:"${stagingDir}/WEB-INF/classes")
}

你应该完成...

附言如果您使用的是 Oracle 数据库,请将以下内容添加到 BuildConfig.groovy在依赖项块中,以便您可以访问 Quartz-Oracle 通信驱动程序:
runtime("org.quartz-scheduler:quartz-oracle:1.7.2") {
// Exclude quartz as 1.7.3 is included from the plugin
excludes('quartz')
}

P.P.S 上面链接中的 sql 文件只是 SQL。要将其放入休眠文件中,只需将每个单独的 SQL 命令用 Hibernate database-object 括起来即可。节点,像这样(再次使用 Oracle 示例):
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>

<hibernate-mapping>

<database-object>
<create>
CREATE TABLE QRTZ_JOB_DETAILS (
JOB_NAME VARCHAR2(200) NOT NULL,
JOB_GROUP VARCHAR2(200) NOT NULL,
DESCRIPTION VARCHAR2(250) NULL,
JOB_CLASS_NAME VARCHAR2(250) NOT NULL,
IS_DURABLE VARCHAR2(1) NOT NULL,
IS_VOLATILE VARCHAR2(1) NOT NULL,
IS_STATEFUL VARCHAR2(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR2(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (JOB_NAME,JOB_GROUP)
)
</create>
<drop>DROP TABLE QRTZ_JOB_DETAILS</drop>
<dialect-scope name='org.hibernate.SomeOracleDialect' />
</database-object>
...
<database-object>
<create>INSERT INTO QRTZ_LOCKS VALUES('TRIGGER_ACCESS')</create>
<drop></drop>
<dialect-scope name='org.hibernate.SomeOracleDialect' />
</database-object>
...
</hibernate-mapping>
dialect-scope告诉 Hibernate 应该使用哪些数据库方言创建和删除节点。您可以尝试忽略它并查看它是否有效,否则您可能需要添加 Grails 数据源使用的 MySql 方言。

关于Grails 集群 quartz 作业示例代码和所需的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com