基于Java的多线程监控系统及方法
文献发布时间:2023-06-19 10:32:14
技术领域
本发明涉及计算机技术领域,尤其涉及基于Java的多线程监控系统及方法。
背景技术
近年来,随着银行金融业务的不断发展,对信息化建设的要求也越来越高。PCTS系统作为中行全球金融市场一体化的对私交易平台,主要提供对私外汇、期权、贵金属以及保证金类的金融产品,面对众多的对私客户,日交易量极大。为了能够快速响应客户请求,解决系统高并发问题,系统中的主要业务逻辑实现都依赖于多线程。多线程的使用虽然在一定程度上大幅提高了系统的响应速度,但是线程的异常终止、假死现象又给系统带来了一定的风险。
现有的多线程监控方法存在维护成本高、运行速度低、生产维护效率低的问题。因此,亟需一种可以克服上述问题的多线程监控方案。
发明内容
本发明实施例提供一种基于Java的多线程监控系统,用以监控多线程,提高生产维护的效率和运行速度,降低维护成本,该系统包括:监控主线程模块,心跳日志模块,系统运行日志模块,服务接口层和Web监控主界面;
所述心跳日志模块用于记录各业务子线程在非工作状态时的心跳信息;
所述系统运行日志模块用于记录各业务子线程在工作状态时的操作信息;
所述监控主线程模块用于建立Java线程池,监控各业务子线程的状态信息、心跳信息以及操作信息,根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中,所述各业务子线程由Java线程池创建;
所述服务接口层用于从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并向Web监控主界面提供线程操作接口以及推送异常告警信息;
所述Web监控主界面调用服务接口层,用于显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。
本发明实施例提供一种基于Java的多线程监控方法,用以监控多线程,提高生产维护的效率和运行速度,降低维护成本,该方法包括:
监控主线程模块建立Java线程池,所述Java线程池创建各业务子线程;
心跳日志模块记录各业务子线程在非工作状态时的心跳信息;
系统运行日志模块记录各业务子线程在工作状态时的操作信息;
监控主线程模块监控各业务子线程的状态信息、心跳信息以及操作信息;
监控主线程模块根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中;
服务接口层从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果;
服务接口层向Web监控主界面提供线程操作接口以及推送异常告警信息;
Web监控主界面调用服务接口层,显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述基于Java的多线程监控方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述基于Java的多线程监控方法的计算机程序。
本发明实施例提供的基于Java的多线程监控系统包括:监控主线程模块,心跳日志模块,系统运行日志模块,服务接口层和Web监控主界面;所述心跳日志模块用于记录各业务子线程在非工作状态时的心跳信息;所述系统运行日志模块用于记录各业务子线程在工作状态时的操作信息;所述监控主线程模块用于建立Java线程池,监控各业务子线程的状态信息、心跳信息以及操作信息,根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中,所述各业务子线程由Java线程池创建;所述服务接口层用于从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并向Web监控主界面提供线程操作接口以及推送异常告警信息;所述Web监控主界面调用服务接口层,用于显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。本发明实施例通过监控主线程模块实现了对心跳信息和操作信息的线程异常进行统计分析,无需人工查看日志。开发维护人员只需通过Web监控主界面即可查看各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并对线程进行相关干预,从而有效监控多线程,提高生产维护的效率和运行速度,降低维护成本。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本发明实施例中基于Java的多线程监控系统结构图;
图2为本发明实施例中基于Java的多线程监控方法示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
为了监控多线程,提高生产维护的效率和运行速度,降低维护成本,本发明实施例提供一种基于Java的多线程监控系统,如图1所示,该系统可以包括:监控主线程模块101,心跳日志模块102,系统运行日志模块103,服务接口层104和Web监控主界面105;
所述心跳日志模块102用于记录各业务子线程在非工作状态时的心跳信息;
所述系统运行日志模块103用于记录各业务子线程在工作状态时的操作信息;
所述监控主线程模块101用于建立Java线程池,监控各业务子线程的状态信息、心跳信息以及操作信息,根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中,所述各业务子线程由Java线程池创建;
所述服务接口层104用于从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并向Web监控主界面105提供线程操作接口以及推送异常告警信息;
所述Web监控主界面105调用服务接口层104,用于显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。
由图1所示可以得知,本发明实施例提供的基于Java的多线程监控系统包括:监控主线程模块,心跳日志模块,系统运行日志模块,服务接口层和Web监控主界面;所述心跳日志模块用于记录各业务子线程在非工作状态时的心跳信息;所述系统运行日志模块用于记录各业务子线程在工作状态时的操作信息;所述监控主线程模块用于建立Java线程池,监控各业务子线程的状态信息、心跳信息以及操作信息,根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中,所述各业务子线程由Java线程池创建;所述服务接口层用于从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并向Web监控主界面提供线程操作接口以及推送异常告警信息;所述Web监控主界面调用服务接口层,用于显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。本发明实施例通过监控主线程模块实现了对心跳信息和操作信息的线程异常进行统计分析,无需人工查看日志。开发维护人员只需通过Web监控主界面即可查看各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并对线程进行相关干预,从而有效监控多线程,提高生产维护的效率和运行速度,降低维护成本。
发明人发现,当前国内金融市场逐渐开放,金融交易日渐活跃。随着客户交易量的直线上升,对金融产品交易系统的压力也越来越大。为了缓解系统压力,解决系统瓶颈,越来越多的交易系统采用了分布式多节点集群部署,单台节点应用采用多线程方式处理。对于多节点的监控,目前往往有比较成熟的方案,然而对于更细粒度化的线程监控,还没有完备的解决方案,仅仅是通过心跳日志来查看线程状态。如有单个线程异常,直接简单粗暴的重启整个服务进程解决。这样一来正常工作的线程也被重启,增加了该节点业务处理受影响的程度。目前对于多线程的监控主要是由两种方式:第一种是直接使用线程池管理多个线程,通过线程池获取各个线程的状态直接输出到应用日志中,或者是通过线程打印的心跳日志来分析线程状态。第二种是通过JDK自带的jvisualvm监控工具,或者是第三方的监控工具JProfile等对整个JVM(包括线程资源)进行监控。该种方式主要应用于对系统的性能分析场景中,包括对CPU使用率、内存(堆、栈)使用程度、以及各个线程的状态,执行时间等进行监控。
而在实际应用中上述方法存在问题,采用线程池监控方式或心跳日志方式仅能通过人为的日志分析来获取线程状态,而且不能对线程进行有效的干预,增加了维护的成本。采用JVM渗透式监控工具在监控过程中,服务端会额外启动一个监听程序供监控工具连接,此种监控方式会对服务的运行速度大幅下降,因此该种方式若用到实际生产运行时是不可取的。在实际生产运维中,若单个线程出现故障,往往通过重启整个应用进程的方式来重启线程,这样一来,整个应用服务都会受到影响。本发明实施例提供了更好地监控线程的方法,并能对单个线程进行操作,而不影响其他正常线程或整个进程服务,操作更加细粒度化,大大提高了生产维护的效率,并减小了应用进程重启带来的风险。
实施例中,监控主线程与常见的建立多线程的方式不同,本发明实施例在建立多线程前首先建立监控主线程。监控主线程作为进程中的一个常驻线程,其作用是建立线程池,监控各个业务子线程的状态信息,自动重启异常消亡线程;还可以监控各个业务线程输出的心跳日志以及打印的应用日志信息;并且将线程的唯一标识ID、线程名称、线程异常输出信息等及时采集到JVM内存数据结构中,当发现线程有假死现象时自动进行重启动作。
实施例中,心跳日志模块和系统运行日志模块中,每个业务线程在非工作状态时每隔1min(时间可配置)输出一次心跳信息,以证明自己是唤醒状态,随时可以投入工作中。系统运行日志里会记录每个线程在实际处理业务逻辑时的操作信息,当线程遇到异常数据或其他因素引起的运行时异常时,会及时打印相关报错的堆栈信息。
举一例,比如在实际使用时,业务线程1每隔1min打印一次:
2020-11-11 08:01:00 000[thread1]Thread1 is heartbeating!
2020-11-11 08:02:00 000[thread1]Thread1 is heartbeating!
2020-11-11 08:03:00 000[thread1]Thread1 is heartbeating!
当主线程发现8点04分没有打印日志时认为thread1已经死机了,此时主线程会去搜索该线程[thread1]的最后一次业务日志输出信息,并将这些信息保存在内存中。
存储结构为List
举例:Key:thread1 Value:status:1,heartBeatNormal:0,logInfo:”Error[thread1]Null Pointer Exception”。技术人员可以通过Web监控主界面看到这些日志,能快速定位出thread1遇到了空指针异常。无需去机房,在工位即可快速定位问题,并且出问题时会有告警产生,及时通知维护人员。
实施例中,服务接口层主要为Web监控主界面提供相关的线程操作接口和具体实现,以及提供线程异常告警信息的推送功能。服务的提供有两种实现方式,具体取决于服务的类型。对于Web应用或普通Java应用来说,可以采用Spring框架的RMI发布服务;对于Java分布式服务类,可以采用Dubbo,Thrift等服务框架来实现服务的发布。
实施例中,Web监控主界面面作为服务接口层的调用者,主要是为开发维护人员提供各个线程的状态信息展示和操作按钮。
实施例中,心跳日志模块还用于:根据所述心跳信息打印心跳日志;所述系统运行日志模块还用于:在业务子线程发生异常时,根据所述操作信息打印应用日志。
实施例中,监控主线程模块进一步用于:根据各业务子线程的线程属性信息和对应的状态信息、心跳信息,判断线程是否假死,得到判断结果;根据各业务子线程的操作信息,确定线程异常原因;根据所述判断结果和线程异常原因,确定分析结果。
实施例中,Web监控主界面通过Http Ajax或Socket调用服务接口层的API。还可以给技术人员发送短信,短信内容可以为“您好,应用线程:线程号工作异常,请及时处理。”
实施例中,线程池是一种多线程的处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。通过线程池的使用可以控制线程数量,提高线程的可管理性,减少每次获取资源的消耗,提高对资源的利用率。通过心跳日志的打印,可以分析出线程是否是正常运行、阻塞等,对于线程的状态分析不可或缺。监控主线程作为常驻线程起了总控的作用,并对多线程信息的收集分析起了不可替代的作用,取代了人工对日志的查看分析。服务接口层提供线程的各种操作,包含状态查询、挂起、唤醒、重启等,并提供了异常信息查询和异常信息推送等功能,服务的创建、发布也需要一定的框架支持。在对客交易系统生产运维中,对更细粒度化的线程操作比对整个应用进程进行操作要安全的多,对业务的影响也最小。本发明实施例通过监控主线程实现了对心跳日志和应用日志中的线程异常输出信息进行统计分析,无需人工查看日志。开发维护人员只需通过Web监控界面即可查看各个线程的状态和异常信息输出,对线程进行相关干预。线程出现故障时自动发邮件、短信给相关开发维护人员,及时发现应用异常。实际生产中发生的单个业务线程故障,可以通过监控界面进行线程重启而无需启动整个服务进程,重启单个线程带来的风险远小于重启整个应用服务,在时间上也大大缩减。
基于同一发明构思,本发明实施例还提供了一种基于Java的多线程监控方法,如下面的实施例所述。由于这些解决问题的原理与基于Java的多线程监控系统相似,因此方法的实施可以参见系统的实施,重复之处不再赘述。
图2为本发明实施例中基于Java的多线程监控方法的示意图,如图2所示,该方法包括:
步骤201、监控主线程模块建立Java线程池,所述Java线程池创建各业务子线程;
步骤202、心跳日志模块记录各业务子线程在非工作状态时的心跳信息;
步骤203、系统运行日志模块记录各业务子线程在工作状态时的操作信息;
步骤204、监控主线程模块监控各业务子线程的状态信息、心跳信息以及操作信息;
步骤205、监控主线程模块根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中;
步骤206、服务接口层从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果;
步骤207、服务接口层向Web监控主界面提供线程操作接口以及推送异常告警信息;
步骤208、Web监控主界面调用服务接口层,显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。
一个实施例中,基于Java的多线程监控方法还包括:
心跳日志模块记录各业务子线程在非工作状态时的心跳信息之后,根据所述心跳信息打印心跳日志;
系统运行日志模块记录各业务子线程在工作状态时的操作信息之后,在业务子线程发生异常时,根据所述操作信息打印应用日志。
一个实施例中,监控主线程模块根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,包括:
监控主线程模块根据各业务子线程的线程属性信息和对应的状态信息、心跳信息,判断线程是否假死,得到判断结果;
监控主线程模块根据各业务子线程的操作信息,确定线程异常原因;
监控主线程模块根据所述判断结果和线程异常原因,确定分析结果。
一个实施例中,所述Web监控主界面通过Http Ajax或Socket调用服务接口层的API。
综上所述,本发明实施例提供的基于Java的多线程监控系统包括:监控主线程模块,心跳日志模块,系统运行日志模块,服务接口层和Web监控主界面;所述心跳日志模块用于记录各业务子线程在非工作状态时的心跳信息;所述系统运行日志模块用于记录各业务子线程在工作状态时的操作信息;所述监控主线程模块用于建立Java线程池,监控各业务子线程的状态信息、心跳信息以及操作信息,根据各业务子线程的线程属性信息和对应的状态信息、心跳信息以及操作信息进行线程运行情况分析,将分析结果采集至内存数据结构中,所述各业务子线程由Java线程池创建;所述服务接口层用于从内存数据结构和Java线程池中读取各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并向Web监控主界面提供线程操作接口以及推送异常告警信息;所述Web监控主界面调用服务接口层,用于显示各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果。本发明实施例通过监控主线程模块实现了对心跳信息和操作信息的线程异常进行统计分析,无需人工查看日志。开发维护人员只需通过Web监控主界面即可查看各业务子线程的线程属性信息和对应的状态信息、心跳信息、操作信息和分析结果,并对线程进行相关干预,从而有效监控多线程,提高生产维护的效率和运行速度,降低维护成本。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
- 基于Java的多线程监控系统及方法
- 一种高效的基于Java多线程和反射的任务执行方法