В начале года я опубликовал пост о том, как выполнять задания cron с помощью Apache Camel в JBoss Fuse, поэтому я делаю это потому, что иногда нам нужно разгрузить интеграционные задания и запланировать их выполнение за меньшее время в течение часы заняты Cron Jobs позволяет запускать интеграционное приложение в определенный период времени, в течение которого вы его запускаете, в основном в ночное время. Для достижения этой цели мы используем компонент 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>
Так как мы собираемся развернуть это с фабрикой, мы поместим файл свойств в main / fabric.
Внутри myquartz.properties содержится информация об общей базе данных, такая как драйвер, идентификатор, пароль, а также детали настройки, такие как количество потоков, используемый driverDelegateClass и самое главное, если этот параметр кластеризован.
# 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>
По сути, он запускается заданием cron каждые 0 и 45 секунд, а затем создает файл с именем MyJob-YYYYMMDDHHMMSS.txt с содержимым Hello. Это содержимое из Quartz2 в файле.
И чтобы развернуть приложение в JBoss Fuse, мне нужно создать фрагментный пакет для пула соединений, здесь мы используем c3p0 и драйвер JDBC. И затем разверните оба на том же экземпляре. Разверните другой контейнер с тем же профилем работы и фрагментным комплектом. Добавьте другой профиль, который печатает содержимое, полученное на FTP-сервере. Если при развертывании возникнут какие-либо проблемы, возможно, OSGi неправильно загружает пакеты, вы можете просто перезапустить контейнер или убедиться, что в нем активированы следующие пакеты. (Проверьте с помощью
osgi: list )
[157] [Active] [] [] [80] Apache ServiceMix :: Bundles :: c3p0 (0.9.1.2_1), фрагменты: 148
[167] [Active] [] [] [80] База данных H2 Движок (1.4.181)
[172] [Активный] [Создан] [] [80] Quartz Two Demo (1.0.0.SNAPSHOT)
Взгляните на журнал с профилем кварцевого отпечатка, вы увидите, что задания сгруппированы, а нагрузки — делится между двумя узлами. А детали работы также можно найти в консоли каждого контейнера. Вы можете найти демо-код и подробные инструкции здесь .