
- Поиск в заданном каталоге и его подкаталогах (возможно) в поисках файлов определенного типа.
- Если файл найден, проверьте его дату: нужно ли искать ошибки?
- Если файл достаточно молодой, чтобы его можно было проверить, проверьте его и найдите исключения.
- Если в нем есть исключения, это те, кого мы ищем, или они были исключены?
- Если он содержит исключения, которые нам нужны, добавьте детали в отчет.
- После проверки всех файлов отформатируйте отчет, готовый к публикации.
- Опубликуйте отчет по электронной почте или другим способом.
- Все это будет работать в определенное время каждый день
В этом блоге рассматривается требование № 8: «Все будет выполняться в определенное время каждый день», а это означает реализацию какого-либо планирования.
Сейчас Java существует очень давно, а это значит, что есть несколько способов планирования задачи. Они варьируются от:
- Используя простой поток с длинным
sleep(...). - Использование объектов
TimerиTimerTask. - Использование
ScheduledExecutorService. - Использование Spring
TaskExecutorиTaskSchedulerклассов. - Использование аннотаций Spring
@EnableSchedulingи@Scheduled(Spring 3.1 и выше). - Использование более профессионального расписания.
Более профессиональное разнообразие планировщиков варьируется от Кварца (бесплатно) до Обсидиана (казалось бы, гораздо более продвинутый, но стоит денег). Spring, как и следовало ожидать, включает поддержку Quartz Scheduler; на самом деле есть два способа интеграции Quartz Scheduler в ваше приложение Spring:
- Использование JobDetailBean
- Использование
MethodInvokingJobDetailFactoryBean.
Для этого приложения я использую интеграцию Spring Quartz вместе с MethodInvokingJobDetailFactoryBean ; причина в том, что использование Quartz позволяет мне настроить расписание с помощью выражения cron, а MethodInvokingJobDetailFactoryBean можно настроить быстро и просто, используя несколько строк XML.
Техника выражения cron, используемая Spring и Quartz, была бесстыдно взята из планировщика cron Unix . Для получения дополнительной информации о том, как Quartz работает с выражениями cron, взгляните на страницу cron Quartz . Если вам нужна помощь в создании собственных выражений cron, тогда вы обнаружите, что Cron Maker — действительно полезная утилита.
Первое, что нужно сделать при настройке Spring и Quartz, это включить следующие зависимости в файл проекта POM:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<!-- QuartzJobBean is in spring-context-support.jar --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favour of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- Spring + Quartz need transactions --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Quartz framework --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6</version> <!-- You can't use Quartz two with Spring 3 --> </dependency> |
Это довольно просто с одним крошечным «Gotcha» в конце. Во-первых, поддержка Spring в Quartz находится в spring-context-support-3.2.7.RELEASE.jar (замените ваш номер версии Spring, если это применимо). Во-вторых, вам также необходимо включить библиотеку транзакций Spring — spring-td-3.2.7.RELEASE.jar . Наконец, вам нужно включить версию планировщика Quartz; однако будьте осторожны, так как Spring 3.x и Quartz 2.x не работают вместе «из коробки» (хотя, если вы посмотрите вокруг, есть специальные исправления, которые можно найти). Я использовал Quartz версии 1.8.6, которая делает именно то, что мне нужно.
Следующее, что нужно сделать, это разобраться в конфигурации XML, и это включает в себя три шага:
- Создайте экземпляр
MethodInvokingJobDetailFactoryBean. У него есть два свойства: имя компонента, который вы хотите вызывать с запланированным интервалом, и имя метода этого компонента, который вы хотите вызвать. -
CronTriggerFactoryBeanс выражением cron с помощьюCronTriggerFactoryBean - И, наконец, составьте расписание для всего кабачка, используя
SchedulerFactoryBean
Настроив эти три bean-компонента, вы получите XML, который выглядит примерно так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<bean id="FileLocatorJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="errorTrackService" /> <property name="targetMethod" value="trackErrors" /> </bean> <bean id="FileLocatorTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="FileLocatorJob" /> <!-- run every morning at 2 AM --> <property name="cronExpression" value="${cron.expression}" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="FileLocatorTrigger" /> <!-- Add other triggers for other jobs (if any) here <ref bean="" /> --> </list> </property> </bean> |
Обратите внимание, что я использовал заполнитель для моего выражения cron. Фактическое выражение cron можно найти в файле app.properties :
|
1
2
3
4
5
|
# run every morning at 2 AM cron.expression=0 0 2 * * ?# Use this to test the app (every minute) #cron.expression=0 0/1 * * * ? |
Здесь у меня есть два выражения: одно, которое планирует выполнение задания на 2 часа утра и другое, закомментированное, которое запускает задание каждую минуту. Это пример того, что приложение не совсем промышленно. Если бы существовало «правильное» приложение, я бы, вероятно, использовал разные наборы свойств в каждой среде (DEV, UAT, production и т. Д.).
Осталось только пару шагов, прежде чем это приложение может быть выпущено, и первым из них является создание исполняемого файла JAR. Подробнее об этом в следующий раз.
- Код для этого блога доступен на Github по адресу: https://github.com/roghughe/captaindebug/tree/master/error-track . Если вы хотите посмотреть другие блоги этой серии, загляните сюда …
- Отслеживание исключений приложений с помощью Spring
- Отслеживание исключений в Spring — часть 2 — шаблон делегата
- Отчеты об отслеживании ошибок — часть 3 — стратегия и пакет
- Отслеживание исключений — часть 4 — отправитель почты Spring
| Ссылка: | Отслеживание исключений — часть 5 — планирование с помощью Spring от нашего партнера по JCG Роджера Хьюза в блоге Captain Debug’s Blog . |