我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是jstack命令
来查看线程堆栈,然后根据我们监控中的threadId或者threadName来查找线程详细堆栈看卡在哪个方法。
常用命令如下:
jstack pid >jstack.log
现在我们可以提供界面查看卡死线程堆栈
controller代码
@RequestMapping("/getStackTrace") @ResponseBody public String getStackStace(HttpServletRequest request, HttpServletResponse response) { logger.debug("执行选择的Job对象 queryQuartzLog quartzLog:"); try { String threadId=request.getParameter("threadId"); if(StringUtils.isBlank(threadId)){ return ""; } ThreadInfo info = ThreadUtilities.getExtendThreadInfo(Long.valueOf(threadId)); List<String> list=new ArrayList<String>(); StackTraceElement[] st=info.getStackTrace(); int index=0; MonitorInfo[] monitors=info.getLockedMonitors(); for(StackTraceElement e:st){ StringBuffer sb=new StringBuffer(); if(index>0){ sb.append(" <- "); sb.append(System.getProperty("line.separator")); } sb.append(e.toString()+ "\n"); list.add(sb.toString()); if (monitors != null) { for (MonitorInfo mi : monitors) { if (mi.getLockedStackDepth() == index) { list.add(" <- - locked "+mi.toString()); } } } index++; } return generateHtml("vm/getStackTrace.vm", list); } catch (Exception e) { logger.error("doRunQuartzJob 执行选择的Job对象出错", e); return "fail"; } }
ThreadUtilities.getExtendThreadInfo
public static ThreadInfo getExtendThreadInfo(final long threadID) { ThreadInfo ti = null; final ThreadMXBean threadMBean = ManagementFactory.getThreadMXBean(); if (threadMBean.isObjectMonitorUsageSupported()) { // VMs that support the monitor usage monitoring ThreadInfo[] infos = threadMBean.dumpAllThreads(true, false); for (ThreadInfo info : infos) { if (info.getThreadId() == threadID) { ti = info; break; } } } else { // VM doesn't support monitor usage monitoring ti = threadMBean.getThreadInfo(threadID, Integer.MAX_VALUE); } return ti; }
然后通过vm代码将堆栈展示在页面上
getStackTrace.vm
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="description" content="" /> <meta name="Keywords" content="" /> <title>job logs</title> </head> <body> <div> #foreach($element in $data) $element<br/> #end </div> </body> </html>
public class BaseController { private static final VelocityEngine ve = new VelocityEngine(); private static final Logger logger = LoggerFactory.getLogger(QuartzController.class); static{ // 初始化Velocity引擎 InputStream is = BaseController.class.getResourceAsStream("/velocity.properties"); Properties properties = new Properties(); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } ve.init(properties); } public String generateHtml(String vmTemplate,Object obj){ StringWriter sw = new StringWriter(); try { VelocityContext ctx = new VelocityContext(); ctx.put("data", obj); ve.getTemplate(vmTemplate,"UTF-8").merge(ctx, sw); } catch (Exception e) { logger.error("转化vm模板出错",e); }finally{ if(sw!=null){ try { sw.close(); } catch (IOException e) { e.printStackTrace(); } } } return sw.toString(); } }
相关推荐
windows版本的进程监控,C#基于多线程Quartz实现,每10秒监测一次.zip
java,quartz,任务监控管理,这是一个java编写的任务监控简单项目包
根据作业调度组件Quartz.Net的最新的版本2.2.4的源代码而修改的版本 保留了Common.Logging之外,还增加了直接使用NLog和log4net作为日志输出组件,通过不同的编译模式进行选择 本人亲自测试,其中examples的各个...
这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz.NET怎样能并发运行多个作业的原理。...
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...
Quartz使用StdSchedulerFactory(调度器工厂)实现多线程原理,可以自定义线程个数来实现不同的需求,代码中有详细注释说明
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...
使用Quartz调度任务,根据需要人为的终止某个任务,适用于很多常见的场景
用一个工作线程创建一个调度程序; 安排三个不同优先级的触发器,第一次同时触发,第二次以错开的时间间隔触发; 启动Quartz Scheduler; 等待30秒让 Job 有机会触发触发器; 关闭调度程序;
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...
C# winform windows版本的进程监控,基于多线程Quartz实现,每10秒监测一次。 1.进程监控每10秒监测一次。 2.红色表示 对其监控,但是未运行 3.灰色表示未启用对当前进程的监控 4.白色表示正常运行的进程信息
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
从以上位置可以查看详细介绍。 网上能找到的Quartz Web管理的资料都是使用的一个国外人写的Quartz WebApp的东东,功能也很全面。但是作为自己的应用其实用不了那么多功能,一般我们只要可以定义一个job,指定一个...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
quartz简单实例quartz简单实例quartz简单实例quartz简单实例
quartz-2.2.3版本的quartz初始化sql语句