今年年初,我发布了一篇关于如何在 JBoss Fuse 中使用 Apache Camel 执行 cron 作业的帖子,我这样做的原因是有时我们需要卸载集成作业并安排它们在更短的时间内运行繁忙时间。 Cron Jobs 允许您在您设置的特定时间运行集成应用程序,它主要在夜间运行。我们使用 camel 中的 Quartz2 组件来实现这一点。
只是回顾一下我遇到的情况。基本上它会启动两个运行相同 cron 作业的实例,该作业只是将文件写入 FTP 服务器。该作业由 Quartz2 实现并设置为每分钟运行两次,两个实例都连接到数据库(在我的代码中我使用 H2 以便于安装,但还有另一个选项使用 PostgreSQL 数据库,请参阅我之前的博客)。我们想要将它们连接到数据库的原因是确保这两个实例将共享作业的加载。如果您有一个长时间运行的作业,这将非常有用,并且可以将它们分成不同的部分并在分布式资源之间共享负载。
不要忘记事先设置数据库,设置数据库表模式,下载 Quartz 库, 你会发现设置表的脚本在 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
中包含有关共享数据库的详细信息,例如驱动程序、ID、密码以及设置详细信息,例如线程数、使用的 driverDelegateClass,最重要的是此设置是否是集群的。
<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
<property name="propertiesFile" value="org/blogdemo/demojob/myquartz.properties"/>
</bean>
骆驼路线非常简单易行,
<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
<property name="propertiesFile" value="org/blogdemo/demojob/myquartz.properties"/>
</bean>
基本上,它由 cron 作业踢出,每隔 0 秒和 45 秒,然后创建一个名为
MyJob-YYYYMMDDHHMMSS.txt
的文件,内容为
Hello This is the content from Quartz2
in the file。
为了将应用程序部署到 JBoss Fuse,我需要为连接池创建一个片段包,这里我们使用 c3p0 和 JDBC 驱动程序。然后将两者部署到同一个实例上。
部署另一个具有相同作业配置文件和片段包的容器。
添加另一个配置文件,打印在 FTP 服务器中接收到的内容。
如果您在部署时遇到任何问题,可能是 OSGi 没有正确加载 bundle,您可以简单地重启容器或确保以下 bundle 在容器中被激活。 (使用
osgi:list
检查)
[ 157] [活动] [ ] [ ] [ 80] Apache ServiceMix :: Bundles :: c3p0 (0.9.1.2_1),片段:148
[ 167] [活动] [ ] [ ] [ 80] H2 数据库引擎 (1.4.181)
[ 172] [活动] [已创建] [ ] [ 80]
Quartz 两个演示 (1.0.0.SNAPSHOT)
查看运行quartzprint profile的日志,你会发现作业是集群的,负载在两个节点之间共享。
作业的详细信息也可以在每个容器的控制台中找到。
您可以
在此处找到演示代码和详细说明
。