跟踪异常–第5部分–使用Spring进行计划

屏幕快照2014-04-21 at 12.12.34 看来我终于快要结束本系列有关使用Spring进行错误跟踪的博客了,对于那些还没有阅读该系列博客的人,我正在编写一个简单但几乎具有工业实力的Spring应用程序,扫描日志文件中的异常,然后生成报告。 在本系列的第一个博客中,这些是我的最初要求:

  1. 搜索给定目录及其子目录(可能)以查找特定类型的文件。
  2. 如果找到文件,请检查其日期:是否需要搜索文件以查找错误?
  3. 如果文件足够年轻以至于无法检查,则对其进行验证,以查找异常。
  4. 如果它包含例外,是我们正在寻找的例外还是被排除在外?
  5. 如果它包含我们所需要的例外类型,则将详细信息添加到报告中。
  6. 检查完所有文件后,格式化报告以准备发布。
  7. 使用电子邮件或其他技术发布报告。
  8. 整个过程每天都会在给定的时间运行

该博客介绍了满足8号要求的情况: “整个事情每天都会在给定的时间运行” ,这意味着实施某种调度。

现在,Java已经存在了很长时间,这意味着有许多调度任务的方法。 这些范围包括:

  • 使用一个简单的线程并长时间sleep(...)
  • 使用TimerTimerTask对象。
  • 使用ScheduledExecutorService
  • 使用Spring的TaskExecutorTaskScheduler类。
  • 使用Spring的@EnableScheduling@Scheduled注释(从Spring 3.1开始)。
  • 使用更专业的时间表。

调度程序的专业性更强,从Quartz (免费)到Obsidian (似乎更高级,但要花钱)。 如您所料,Spring包含了Quartz Scheduler支持。 实际上,有两种方法可以将Quartz Scheduler集成到您的Spring应用程序中,它们是:

  1. 使用JobDetailBean
  2. 使用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配置,这涉及三个步骤:

  1. 创建一个MethodInvokingJobDetailFactoryBean的实例。 它具有两个属性:要在预定的时间间隔调用的bean的名称,以及要调用的bean上的方法的名称。
  2. 使用CronTriggerFactoryBeanMethodInvokingJobDetailFactoryBean耦合到cron表达式
  3. 最后,使用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 。 如果您想查看本系列中的其他博客,请在这里看……
  1. 使用Spring跟踪应用程序异常
  2. 使用Spring跟踪异常–第2部分–委托模式
  3. 错误跟踪报告–第3部分–策略和软件包私有
  4. 跟踪异常–第4部分– Spring的邮件发件人

翻译自: https://www.javacodegeeks.com/2014/04/tracking-exceptions-part-5-scheduling-with-spring.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.util.hashmap_java.util.HashMap中的无限循环

我在这里经常有一些Vaadin代码阻塞,我不知道问题是什么&#xff1a;Thread 7892: (state IN_JAVA)- java.util.HashMap.getEntry(java.lang.Object) bci61, line349 (Compiled frame; information may be imprecise)- java.util.HashMap.containsKey(java.lang.Object) bci2, …

APP测试理论知识点

什么是APP测试&#xff1f; App测试就是软件工程师对这类应用软件进行功能测试&#xff0c;性能测试&#xff0c;安全性测试以及兼容性测试等。 对于app测试我们一般采用的是黑盒测试方法&#xff0c;也会在必要的时候进行自动化测试以及性能测试&#xff0c;丙炔对于app还会有…

超大超长图片居中显示且放大缩小无影响

1. 超大图片居中显示 1.1 放大缩小都居中显示 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body {overflow-x: hidden;}.top-banner .banner-list a {display: b…

蘋果的秘密武器

蘋果公司(Apple)在電腦操作平台之戰中負於微軟公司 (Microsoft)已經過去很多年了。如今﹐90%以上的筆記本電腦和台式電腦在使用微軟的Windows操作系統。然而近幾年來﹐蘋果公司對Windows主宰的世界發起突然襲擊﹐它的武器就是Windows版的iTunes﹐一個免費的媒體管理、儲存和播放…

如何使用NodeManager来控制WebLogic Server

在上一篇文章中 &#xff0c;您已经了解了如何启动WebLogic管理员和多个托管服务器。 该指令的一个缺点是这些进程将从前台开始&#xff0c;而STDOUT则打印在终端上。 如果打算将这些服务器作为后台服务运行&#xff0c;则可能需要尝试使用WebLogic节点管理器wlscontrol.sh工具…

php接口开发 安全_PHP开发api接口安全验证的实例讲解

php的api接口在实际工作中&#xff0c;使用PHP写api接口是经常做的&#xff0c;PHP写好接口后&#xff0c;前台就可以通过链接获取接口提供的数据&#xff0c;而返回的数据一般分为两种情况&#xff0c;xml和json,在这个过程中&#xff0c;服务器并不知道&#xff0c;请求的来源…

树:重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。 /// 1/// …

css随堂笔记(一)

Css初体验第一天 1 css初识&#xff1a;css主要用于设置HTML页面中文本内容&#xff0c;图片的外形&#xff0c;以及版面的布局等外观显示样式 Css样式规范&#xff1a;h1{属性&#xff1a;值} 2 css的三总书写方式&#xff1a;1 行内样式 将样式写在标签里面,只能作用于当前标…

关于全排列

嗯... 关于全排列&#xff0c;有很多种种做法... 嗯.... 那什么叫全排列呢&#xff1f;&#xff1f;&#xff01;&#xff01; 从n个不同元素中任取m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排列起来&#xff0c;叫做从n个不同元素中取出m个元素的一个排…

[Java]如何安排任务间隔运行

应用程序中经常需要在后台运行某些特定任务以在一定间隔内完成某些工作。 该示例可以是&#xff0c;服务在后台运行以清理应用程序&#xff0c;就像我们有Java Garbage集合一样。 在本文中&#xff0c;我将向您展示3种不同的方法来实现这一目标 他们如下 使用简单的线程 使…

Sky Line 与 ArcEngine的粘合剂 Composite UI AB?

如今的goverment领导们觉得地图都太抽象&#xff0c;只有google Earth式的应用能引起他们的兴趣&#xff0c;作为为公仆服务的我们自然要学习掌握3D GIS技术来提高zf的执政能力了&#xff0c;于是Sky Line来了&#xff0c;拿到开发手册的时候觉得接口不多应该很容易开发&#x…

php if终止,php判断用户是否掉线及关闭网页的方法分享

要实现判断用户已掉线并关闭网页&#xff0c;主要用到方法connection_status 和 connection_aborted。通过一个例子&#xff0c;来了解下它们的用法:echo str_repeat(" ",300);//以下不可省略&#xff0c;否则用户断线&#xff0c;php(线程)立即终止&#xff0c;不会…

默认方法一种扩展旧代码的方法

如您所知&#xff0c;Java的新版本于2014年3月18日发布&#xff0c;我将介绍一系列文章来演示其新功能&#xff0c;也许在某些方面&#xff0c;我将谈论我的想法和批评。 我认为重要的第一个功能是“默认方法”&#xff0c;在所有Java语言的先前版本中&#xff0c;接口只能包含…

vue 如何点击按钮返回上一页

1&#xff0c;vue 如何点击按钮返回上一页呢&#xff1f; 这是vue挂载的范围html代码 <div click"goOff()">返回</div> 下面是点击返回的方法 第一种只返回上一页 goOff(){ this.$router.go(-1); }, 第二种 返回上一页&#x…

2007白领职场成功需要哪“十商”

1.德商(MQ)&#xff1a;指一个人的道德人格品质。德商的内容包括体贴、尊重、容忍、宽容、诚实、负责、平和、忠心、礼貌、幽默等各种美德。 2.智商(IQ)&#xff1a;是一种表示人智力高低的数量指标。也可以表现为一个人对知识的掌握程度&#xff0c;反映人的观察力、记忆力、思…

Remove Element - LeetCode

目录 题目链接注意点解法小结题目链接 Remove Element - LeetCode 注意点 输入的数组是无序的解法 解法一&#xff1a;使用了erase函数&#xff0c;将等于val的值移除。时间复杂度为O(n) class Solution { public:int removeElement(vector<int>& nums, int val) {fo…

DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

url控制第二种写法&#xff08;只要继承了ViewSetMixin&#xff09; url(r^pub/$,views.Pub.as_view({get:list,post:create})), #获取所有记得路由后面加$结束符 #pub/?formatjsonurl(r^pub\.(?P<format>\w)$,views.Pub.as_view({get:list,post:create})), #pu…

要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…

使用Java 8和Lambda简化ReadWriteLock

考虑到旧版Java代码&#xff0c;无论您在哪里看&#xff0c;带有lambda表达式的Java 8绝对可以提高质量和可读性。 今天&#xff0c;让我们看一下ReadWriteLock以及如何使它使用起来更简单。 假设我们有一个称为Buffer的类&#xff0c;该类可以记住队列中的最后几条消息&#x…

[导入]C#好书盘点【月儿原创】

C#好书盘点【月儿原创】 文章来源:http://blog.csdn.net/21aspnet/archive/2007/07/07/1682200.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/07/08/816177.html