`
征途2010
  • 浏览: 247925 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

quartz监控日志(三)查看卡死线程堆栈

阅读更多

我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是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();
		
	}
}

 

 

 

分享到:
评论

相关推荐

    Quartz任务监控管理

    4. **监控和管理**:此项目特别强调“任务监控管理”,因此会包含监控任务状态、查看日志、报警机制等功能。开发者可能通过自定义Listener或者使用Quartz提供的内置监听器来监控Job的执行情况。 5. **异常处理**:...

    windows版本的进程监控,C#基于多线程Quartz实现,每10秒监测一次.zip

    在本项目中,多线程被用来确保进程监控任务与其他应用程序组件并行运行,提高程序效率。 Quartz.NET是一个强大的、完全开源的作业调度框架,它允许开发者定义“作业”(Job)和“触发器”(Trigger),从而实现定时...

    C# winform windows版本的进程监控,基于多线程Quartz实现,每10秒监测一次

    C# winform windows版本的进程监控,基于多线程Quartz实现,每10秒监测一次。 1.进程监控每10秒监测一次。 2.红色表示 对其监控,但是未运行 3.灰色表示未启用对当前进程的监控 4.白色表示正常运行的进程信息

    Quartz多线程示例.rar

    同时,日志记录也非常重要,示例可能利用了Quartz的日志功能,以便追踪和调试任务执行过程中的问题。 总之,"Quartz多线程示例"是一个很好的学习资源,它教你如何利用Quartz的多线程能力来并发执行任务,以及如何...

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    在实际项目中,有时我们需要判断一个Quartz任务是否正在运行,以便进行相应的操作,如避免重复执行或者进行状态监控。本文将详细介绍如何在Quartz中实现这一功能。 首先,理解Quartz的工作原理是关键。Quartz通过...

    Quartz.Net_2.2.4_支持多日志组件版本

    根据作业调度组件Quartz.Net的最新的版本2.2.4的源代码而修改的版本 保留了Common.Logging之外,还增加了直接使用NLog和log4net作为日志输出组件,通过不同的编译模式进行选择 本人亲自测试,其中examples的各个...

    Quartz.NET-2.0

    Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz.NET怎样能并发运行多个作业的原理。...

    Quartz-1.8.6 CSDN 下载

    Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...

    Quartz调度、终止执行的任务

    在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务时,了解如何在Quartz中操作是至关重要的。 首先,让我们详细讲解...

    Quartz-2.2.3 CSDN 下载

    Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...

    Quartz-2.1.7 CSDN 下载

    Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...

    Springboot2+quartz可视化+logback

    同时,为了实现Quartz的可视化,还需要引入一个Web UI组件,如JobAdmin或QuartzSchedulerWebApp,这些UI工具可以帮助我们监控和管理Quartz作业。 【Quartz的Web UI】 描述中提到的"web ui"是指为Quartz提供了一个...

    quartz所需jar包 1.6.0、1.8.5、2.2.1三个版本

    这个压缩包包含了Quartz的三个不同版本:1.6.0、1.8.5以及2.2.1。每个版本的jar包都有其特定的功能和改进,下面是关于这些版本的详细知识: 1. **Quartz 1.6.0**: - Quartz 1.x系列是早期的版本,主要支持JDK 1.4...

    Quartz-2.0.2 CSDN下载

    Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖...

    quartz 定时任务调度

    这样的界面可以方便地进行任务的添加、删除、暂停、恢复和监控,以及查看作业执行日志等操作。 6. **实际应用** 在实际项目中,Quartz可以用于各种场景,如定期数据备份、清理过期记录、发送邮件通知等。通过MVC与...

    Quartz 线程池

    ### 三、Quartz 线程池的配置 Quartz 提供了多种方式来配置线程池,主要通过 `org.quartz.SchedulerFactory` 和 `org.quartz.ThreadPool` 接口实现。以下是一些常见的配置项: - **ThreadPoolSize**:设置线程池的...

    spring和quartz的集成(java线程的方式运行)

    这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用

    (源码)基于SpringBoot和Quartz的Easymon监控系统.zip

    # 基于Spring Boot和Quartz的Easymon监控系统 ## 项目简介 Easymon监控系统是一个业务层面的数据监控平台,旨在帮助系统负责人更好地了解系统运作情况。用户可以通过配置需监控系统的数据源及相关业务监控规则,...

    Quartz所需jar包

    7. **监控和管理**:Quartz提供了丰富的API和接口,可以用来查看当前的调度状态、暂停、恢复或删除任务。 在《Quartz入门》文档中,通常会详细讲解如何配置Quartz,包括XML配置、代码配置,以及如何处理并发问题、...

    对Quartz的简单封装

    5. **日志集成**:集成日志框架,记录任务的执行情况,便于调试和监控。 6. **任务监控**:可能提供了一个简单的Web界面或者API接口,用于查看任务状态、触发器信息以及执行历史,帮助运维人员实时了解任务运行状况...

Global site tag (gtag.js) - Google Analytics