看来我终于快要结束本系列有关使用Spring进行错误跟踪的博客了,对于那些还没有阅读该系列博客的人,我正在编写一个简单但几乎具有工业实力的Spring应用程序,扫描日志文件中的异常,然后生成报告。 在本系列的第一个博客中,这些是我的最初要求:
- 搜索给定目录及其子目录(可能)以查找特定类型的文件。
- 如果找到文件,请检查其日期:是否需要搜索文件以查找错误?
- 如果文件足够年轻以至于无法检查,则对其进行验证,以查找异常。
- 如果它包含例外,是我们正在寻找的例外还是被排除在外?
- 如果它包含我们所需要的例外类型,则将详细信息添加到报告中。
- 检查完所有文件后,格式化报告以准备发布。
- 使用电子邮件或其他技术发布报告。
- 整个过程每天都会在给定的时间运行
该博客介绍了满足8号要求的情况: “整个事情每天都会在给定的时间运行” ,这意味着实施某种调度。
现在,Java已经存在了很长时间,这意味着有许多调度任务的方法。 这些范围包括:
- 使用一个简单的线程并长时间
sleep(...)
。 - 使用
Timer
和TimerTask
对象。 - 使用
ScheduledExecutorService
。 - 使用Spring的
TaskExecutor
和TaskScheduler
类。 - 使用Spring的
@EnableScheduling
和@Scheduled
注释(从Spring 3.1开始)。 - 使用更专业的时间表。
调度程序的专业性更强,从Quartz (免费)到Obsidian (似乎更高级,但要花钱)。 如您所料,Spring包含了Quartz Scheduler支持。 实际上,有两种方法可以将Quartz Scheduler集成到您的Spring应用程序中,它们是:
- 使用JobDetailBean
- 使用
MethodInvokingJobDetailFactoryBean
。
对于此应用程序,我将使用Spring的Quartz集成以及MethodInvokingJobDetailFactoryBean
; 原因是使用Quartz允许我使用cron表达式配置日程表,而MethodInvokingJobDetailFactoryBean
可以使用几行XML快速而简单地配置。
Spring和Quartz使用的cron表示技术是从Unix的cron调度程序中毫不客气地采用的 。 有关Quartz如何处理cron表达式的更多信息,请查看Quartz cron页面 。 如果您在创建自己的cron表达式时需要帮助,那么您会发现Cron Maker是一个非常有用的实用程序。
设置Spring和Quartz时,要做的第一件事是将以下依赖项包含到POM项目文件中:
<!-- 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
的实例。 它具有两个属性:要在预定的时间间隔调用的bean的名称,以及要调用的bean上的方法的名称。 - 使用
CronTriggerFactoryBean
将MethodInvokingJobDetailFactoryBean
耦合到cron表达式 - 最后,使用
SchedulerFactoryBean
调度整个caboodle
配置了这三个bean之后,您将获得一些类似于以下内容的XML:
<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
文件中找到:
# 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和生产等)中使用一组不同的属性。
释放此应用程序仅需几个步骤,而第一个步骤是创建可执行的JAR文件。 下次再说。
- 该博客的代码可在Github上找到: https : //github.com/roghughe/captaindebug/tree/master/error-track 。 如果您想查看本系列中的其他博客,请在这里看……
- 使用Spring跟踪应用程序异常
- 使用Spring跟踪异常–第2部分–委托模式
- 错误跟踪报告–第3部分–策略和软件包私有
- 跟踪异常–第4部分– Spring的邮件发件人
翻译自: https://www.javacodegeeks.com/2014/04/tracking-exceptions-part-5-scheduling-with-spring.html