quartz监控日志(二)添加监听器
上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener。
上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监控。
后面我看了些资料,并重新试了下,这种方案是可行的,并且非常方便。
首先实现TriggerListener,如下:
public class MonitorTriggerListener implements TriggerListener {
private final static Logger logger=Logger.getLogger(MonitorJobRunShell.class);
private ThreadLocal<QuartzLog> localLog=new ThreadLocal<QuartzLog>();
/**
* @see org.quartz.TriggerListener#getName()
*/
@Override
public String getName() {
return "MonitorTriggerListener";
}
/**
* @see org.quartz.TriggerListener#triggerComplete(org.quartz.Trigger, org.quartz.JobExecutionContext, int)
*/
@Override
public void triggerComplete(Trigger arg0, JobExecutionContext jec, int arg2) {
try {
QuartzLog quartzLog=localLog.get();
if(quartzLog==null)return ;
quartzLog.setExeTime(jec.getJobRunTime());
getService().update(quartzLog);
} catch (Exception e) {
logger.error("记录job结束时间异常",e);
}catch (Throwable e) {
logger.error("记录job结束时间出错",e);
}
}
/**
* @see org.quartz.TriggerListener#triggerFired(org.quartz.Trigger, org.quartz.JobExecutionContext)
*/
@Override
public void triggerFired(Trigger arg0, JobExecutionContext jec) {
try {
JobDetail jobDetail = jec.getJobDetail();
System.out.println(localLog.get());
QuartzLog quartzLog=getService().insert(jobDetail.getName());
localLog.set(quartzLog);
System.out.println(quartzLog);
} catch (Exception e) {
logger.error("记录job开始时间异常",e);
}catch (Throwable e) {
logger.error("记录job开始时间出错",e);
}
}
/**
* @see org.quartz.TriggerListener#triggerMisfired(org.quartz.Trigger)
*/
@Override
public void triggerMisfired(Trigger arg0) {
}
/**
* @see org.quartz.TriggerListener#vetoJobExecution(org.quartz.Trigger, org.quartz.JobExecutionContext)
*/
@Override
public boolean vetoJobExecution(Trigger arg0, JobExecutionContext arg1) {
return false;
}
private QuartzLogService getService(){
return (QuartzLogService)BeanLocator.getBeanInstance("quartzLogService");
}
}
然后在初始化StdSchedulerFactory时添加全局监听器,
factory = new StdSchedulerFactory(configProperties);
//启动调度
scheduler = factory.getScheduler();
TriggerListener myListener=new MonitorTriggerListener();
scheduler.addGlobalTriggerListener(myListener);
scheduler.start();
这样同样可以达到监控效果。
quartz监控日志(二)添加监听器的更多相关文章
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,e ...
- quartz 添加监听器listener
全局注册,所有Job都会起作用 JobCountListener listener = new JobCountListener(); sched.getListenerManager().addJo ...
- 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上
一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...
- 【 Quartz】使用 JobListener (任务监听器可实现) 我想在一个任务执行后在执行第二个任务怎么办呢
http://liuzidong.iteye.com/blog/1147528 Quartz之JobExecutionException 博客分类: Java Quartz quartzjobexec ...
- SQL Server AlwaysOn添加监听器失败
标签:MSSQL/ 一.错误描述 1.群集服务未能使群集服务或应用程序“Alwayson22”完全联机或脱机.一个或多个资源可能处于失败状态.这可能会影响群集服务或应用程序的可用性 2.群集服务中的群 ...
- 一个轻巧高效的多线程c++stream风格异步日志(二)
目录 一个轻巧高效的多线程c++stream风格异步日志(二) 前言 LogFile类 AsyncLogging类 AsyncLogging实现 增加备用缓存 结语 一个轻巧高效的多线程c++stre ...
- zabbix监控日志文件
环境: 操作系统:centos 6.8 ,zabbix软件版本:zabbix 3.0.1 前提条件:zabbix客户端已经配置了主动模式,如何配置主动模式,请参考此文 监控日志keys 首先要了解k ...
- zabbix 3.x 监控日志文件
1.启用zabbix主动模式 在zabbix agent端,修改/etc/zabbix/zabbix_agentd.conf ServerActive=服务端IP Hostname=tspnginx0 ...
- C# 面向切面编程--监控日志记录方案
背景:现在公司整体在做监控平台,要求把各个部分的细节都记录下来,在前台页面上有所显示,所以现在需要做的就是一个监控日志的记录工作,今天讲的就是渲染监控日志的例子. 现状:当前的渲染程序没有为监控日志记 ...
- 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题
背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...
随机推荐
- Typora行内公式识别不了
Typora行内公式识别不了,主要是因为行内公式属于LaTeX扩展语法,并非Markdown的通用标准 需要在Typora的"文件"-"偏好设置"-" ...
- .NET 个人博客-给文章添加上标签
个人博客-给文章添加上标签 优化计划 置顶3个且可滚动或切换 推荐改为4个,然后新增历史文章,将推荐的加载更多放入历史文章,按文章发布时间降序排列. 标签功能,可以为文章贴上标签 推荐点赞功能 本篇文 ...
- 在高通lk中添加自定义源文件
在高通lk中添加自定义源文件 背景 在lk开发中,需要添加一个自定义功能,但是又不希望代码污染无关的文件(把无关代码添加到某个源文件中是一种罪). 以添加一个aw9523b.c的驱动为例,在aboot ...
- 使用VS Code 学习算法(第四版)
最近在学习算法(第四版),书中一直在使用命令行来执行Java程序,而使用Eclipse时,很难使用命令行,或者说我根本就不会用,于是就想研究一下使用VS Code来编写代码,使用命令行来执行程序.看了 ...
- var、let、const 区别?
var 存在变量提升.let 只能在块级作用域内访问.const 用来定义常量,必须初始化,不能修改(对象特殊) 1.var[声明变量] var 没有块的概念,可以跨块访问,无法跨函数访问: 2.le ...
- Mac VMware Fusion 11.5 虚拟机带密钥
虚拟机 链接: https://pan.baidu.com/s/19V20p5ZV-1U5lFNHrotLgw 密码: rdun CentOS 6.5 链接: https://pan.baidu.co ...
- Mybatis-Plus最优化持久层开发
Mybatis-plus:最优化持久层开发 一:Mybatis-plus快速入门: 1.1:简介: Mybatis-plus(简称MP)是一个Mybatis的增强工具,在mybatis的基础上只做增强 ...
- [oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
语义分析_抽象语法树_反汇编 回忆 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力 添加图片注释,不超过 140 字(可选) python究竟是 ...
- [oeasy]python0089_大型机的衰落_Dec小型机崛起_PDP_VAX网络
编码进化 回忆上次内容 上次 回顾了 计算机存储单位的演变 最小的读写单位 是 bit 8-bit 固定下来 成为了字节(Byte) 位数 容量 8-bit 1Byte 1024Byte 1 KB 1 ...
- Divide Interval 题解
背景 太逊了,调了三次才调出来,所以写篇题解寄念.LC好睿智 题意 给你两个数 \(a,b\),现在要从 \(a\) 跑到 \(b\),每次可以将当前的 \(a\) 拆分成 \(2^n\times m ...