Grails 集群石英作业示例代码和所需的配置 [英] Grails clustering quartz jobs sample code and config desired

查看:20
本文介绍了Grails 集群石英作业示例代码和所需的配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using the quartz plugin with Grails 1.3.7. I have a need to load balance/cluster a server app that uses quartz jobs. Apparently this is supported but I am finding that all the google search results and links within documents are broken. I've found some raw Java examples but I would assume Grails has a more grailsy way to do this. All I need is a simple example to use as a template. I understand I need to somehow enable quartz to use JDBC to store the jobs and manage locking.

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

I think a link to a single sample would do it. But literally every time I've found something that looks promising it points to a broken link on terracotta's site. Pretty much every site eventually leads me here: http://www.opensymphony.com/quartz/wikidocs/TutorialLesson9.html but when I look on terracotta's site I see Java stuff but no grails. If Java is the only way to do this then so be it, but I feel like there has to be some grails expertise on this out there somewhere!

TIA.

推荐答案

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

To cluster the Quartz plugin in Grails, there are some files you need to include in your project. First, install the grails-app/conf/QuartzConfig.groovy and make sure jdbcStore is enabled.

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

接下来,安装与您将连接的数据库相关的 Hibernate 配置文件.例如,对于 Oracle,grails-app/conf/hibernate/hibernate.cfg.xml 中的基本 Hibernate xml 配置是:

Next, install the Hibernate configuration files relevant to the database to which you will be connecting. For example, with Oracle, the base Hibernate xml config at grails-app/conf/hibernate/hibernate.cfg.xml is:

<?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 上的 Quartz 插件中找到 (https://github.com/nebolsin/grails-quartz), 在 src/templates/sql 下.请注意,这些脚本似乎只适用于数据源 createcreate-drop,因此您需要在 update 上手动创建 Quartz 表代码>,如果它们在之前的运行中不存在.

The actual Quartz-Hibernate SQL file for this example will be named Quartz.oracle.hbm.xml and will reside in the same directory. These files should be available at the Quartz plugin on GitHub (https://github.com/nebolsin/grails-quartz), under src/templates/sql. Note, that these scripts only seem to work for DataSource create and create-drop, so you'll need to manually create the Quartz tables on an update, if they don't already exist from a previous run.

创建一个 grails-app/conf/quartz/quartz.properties 文件,并根据您的业务需求进行

Create a grails-app/conf/quartz/quartz.properties file, and edit is to fit your business needs:

/* 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

注意以上属性,您可以在Config.groovy的Log4j设置中设置org.quartz.plugins来记录相关作业和触发触发信息.我认为 info 级别就足够了.

Note from the above properties, you can set org.quartz.plugins in the Log4j setup of Config.groovy to log relevant job and trigger triggering information. I think info level should suffice.

编辑或创建 scripts/_Events.groovy 并添加以下战争修改闭包.这修复了一个已知的 Quartz 插件错误,以将正确的 quartz.properties 安装到最终的战争文件中,而不是插件中的空白.

Edit, or create, scripts/_Events.groovy and add the following war modification closure. This fixes a known Quartz plugin bug to install the correct quartz.properties, instead of a blank one from the plugin, in to the final war file.

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 通信驱动程序:

P.S. If you are using an Oracle database, add the following to BuildConfig.groovy in the dependencies block, so that you have access to the Quartz-Oracle communication drivers:

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 示例):


P.P.S The sql files at the link above are just the SQL. To make it in to a hibernate file, just surround each individual SQL command with a Hibernate database-object node, like so (again w/ Oracle example):

<?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 方言.

The dialect-scope tells Hibernate with which Database dialects the create and drop nodes should be used. You can try leaving it out and see if it works, otherwise you may have to add the MySql dialect used by your Grails DataSource.

这篇关于Grails 集群石英作业示例代码和所需的配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆