Статьи

Сохранение баланса: работа с кварцевыми Cron-балансирующими нагрузками с предохранителем Red Hat JBoss

В начале года я опубликовал пост о том, как выполнять задания 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)

Взгляните на журнал с профилем кварцевого отпечатка, вы увидите, что задания сгруппированы, а нагрузки — делится между двумя узлами. А детали работы также можно найти в консоли каждого контейнера. Вы можете найти демо-код и подробные  инструкции здесь