查看java线程数量及线程名并进行校验

需求

  • 一个后台Java程序启动时,可以在配置文件中配置线程数量。需要获取线程数量和线程名进行校验。

思路

  1. 读取配置文件,获得配置的线程数量。
  2. 获取该java程序的进程pid
  3. 通过jstack 获取该进程的线程详情并重定向至文件
  4. python 读取该文件并进行分析

实现

该java程序会将pid写入一个文件中,所以直接读取该文件获得pid即可。此处将上述的2、3使用shell脚本实现。

#! /bin/bash
pid=`cat tpid`
jstack $pid >> ./$pid.txt

python 读取该文件并进行分析

# -*- coding: utf-8 -*-
import re
import json
import subprocess
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def get_real_threads_name_list(jstack_file):         #从jstack log中获取实际的线程数及线程名
    log_file = open(jstack_file, 'r')
    pattern = re.compile('"(.*)"')
    real_threads_name_list = pattern.findall(log_file.read())
    log_file.close()
    print json.dumps(real_threads_name_list, encoding='utf-8', ensure_ascii=False)
    return real_threads_name_list

def is_chinese(param_list):       #判断是否中文
    real_threads_num = 0
    for i in param_list:
        if u'\u4e00' <= i <= u'\u9fff':
            real_threads_num += 1
    return real_threads_num


def get_application_threads_num(file_path):      #从配置文件读取配置的线程数量
    application_yaml = open(file_path)
    application_threads_num = 0
    application = yaml.load(application_yaml)
    if application['frms.etl.pay']['enable']:
        application_threads_num += application['frms.etl.pay']['threadSize']
    if application['frms.pay.auditobj']['enable']:
        application_threads_num += application['frms.pay.auditobj']['threadsize']
    if application['frms.pay.ds']['enable']:
        application_threads_num += application['frms.pay.ds']['threadsize']
    if application['frms.pay']['streamcube.publish.enable']:
        application_threads_num += application['frms.pay']['dsobj']['threadsize']
    if application['frms']['pay.etl']['cloud.call']:
        application_threads_num += application['frms']['etl.data.service']['threadSize']
    application_threads_num += application['frms.etl.scheduled.threadSize']
    application_yaml.close()
    return application_threads_num


def compare(a, b):     #比较
    if a == b:
        print 'ok'
    else:
        print 'not ok'


if __name__ == '__main__':
    subprocess.call('pid_log.sh', shell=True)         #调用shell脚本
    real_threads_nums = is_chinese(get_real_threads_name_list('H:\\scripts\\jstack19666.txt'))
    application_threads_nums = get_application_threads_num(
        'application(1).yml')
    compare(real_threads_nums, application_threads_nums)

新需求
通过jstack远程连接服务器
还没实现

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 132,633评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 30,937评论 18 399
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,385评论 14 507
  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,448评论 0 44
  • 在minikube v0.7.1版本中使用`minkube dashboard`命令会遇到以下的错误: 通过`ku...
    我私人的kernel阅读 13,205评论 1 49