保持平衡:负载平衡石英克朗工作与红帽JBoss保险丝


今年年初,我在JBoss Fuse中发布了一篇关于如何使用Apache Camel做cron工作的帖子,我这样做的原因是因为有时我们需要卸载集成工作,并安排它们在繁忙时间以更少的时间运行。Cron Jobs允许您在您设置的某个时间段运行集成应用程序,它将主要在夜间运行。我们使用camel中的Quartz2组件来实现这一点。

只是简单回顾一下我的场景。基本上,它启动两个运行相同cron作业的实例,该作业只需将一个文件写入文件传输协议服务器。该作业由Quartz2实现,并将其设置为每分钟运行两次,两个实例都连接到一个数据库(在我的代码中,为了便于安装,我使用了H2,但还有另一个使用PostgreSQL数据库的选项,请参见我以前的博客)。我们希望将它们连接到数据库的原因是为了确保这两个实例将共享作业的加载。如果您有一个长时间运行的作业,这非常有用,并且可以将它们分成不同的部分,并在分布式资源之间共享负载。

不要忘记预先设置数据库,设置数据库表模式,下载Quartz library,您会发现设置表的脚本在docs/dbTables下,找到您正在使用的数据库的sql文件。运行sql文件来创建数据库中所需的所有表。



让我们回到骆驼项目本身。数据库的设置在属性中。

<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
    <property name="propertiesFile" value="org/blogdemo/demojob/myquartz.properties"/>

</bean>

因为我们将使用fabric部署它,所以我们将把属性文件放在main/fabric下

在myquartz.properties中包含关于共享数据库的详细信息,如驱动程序、标识、密码,以及设置详细信息,如线程数、使用的驱动程序和集群,最重要的是,如果此设置是集群的。

# Main Quartz configuration
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = DatabaseClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = quartzDataSource
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.jobStore.clusterCheckinInterval = 20000


# JobStore: JDBC jobStoreTX
org.quartz.dataSource.quartzDataSource.driver = org.h2.Driver
org.quartz.dataSource.quartzDataSource.URL = jdbc:h2:file:~/h2/cronjob;AUTO_SERVER=TRUE
org.quartz.dataSource.quartzDataSource.user = sa
org.quartz.dataSource.quartzDataSource.password = 

org.quartz.dataSource.quartzDataSource.maxConnections = 5

骆驼路线非常简单易行,

<route id="quartzRoute">
        <from uri="quartz2://myGroup/myTimer?cron=0/45+*+*+*+*+?"/>
        <setHeader headerName="CamelFileName">
            <simple>MyJob-${date:now:yyyyMMdd HH:mm:ss}.txt</simple>
        </setHeader>
        <setBody>
            <simple>${date:now:yyyyMMdd HH:mm:ss} Hello This is the content from Quartz2 - {{instancename}}</simple>
        </setBody>
        <to uri="sftp://demo@localhost?password=ZAQ!2wsx"/>
    </route>

基本上,它每隔0到45秒就被cron作业踢出一次,然后创建一个名为MyJob-YYYYMMDDHHMMSS.txt的文件,内容为Hello这是文件中Quartz2的内容。

为了将应用程序部署到JBoss Fuse,我需要为连接池创建一个片段包,这里我们使用c3p0和JDBC驱动程序。然后将两者部署到同一个实例上。




使用相同的作业配置文件和片段包部署另一个容器。



添加另一个配置文件,打印在文件传输协议服务器中接收的内容。





如果您在部署时遇到任何问题,可能是OSGi没有正确加载包,您可以简单地重新启动容器或确保在容器中激活以下包。(使用osgi:list检查)
[157][活动][][][80]Apache ServiceMix::Bundles::C3 P0(0 . 9 . 1 . 2 _ 1),片段:148
[167][活动] [ ] [ ] [ 80] H2数据库引擎(1.4.181)
[172] [活动][创建] [ ] [ 80]石英二号演示(1.0.0 .快照)


看看运行quartzprint配置文件的日志,您会发现作业是集群的,负载在两个节点之间共享。




并且作业的细节也可以在每个容器的控制台中找到。



您可以找到演示代码和细节
instructions here