一种基于java技术的调用外部可执行命令的系统及方法
【专利说明】—种基于JAVA技术的调用外部可执行命令的系统及方法
[0001] 抟术领域:
本发明涉及计算机语言领域,具体地涉及一种调用外部命令的系统及其方法,特别是一种基于JAVA技术的调用外部可执行命令的系统及方法。
_2] 【背景技术】:
目前通用的JAVA调用外部应用系统的方案是使用JAVA内部提供的Runtime类的exec (String s)方法生成的Process类来执行外部命令,简单的获外部命令输出的标准流和错误流,此方案在正常情况下是没有问题的,但是当外部应用系统存在以下两种不正常的情况时,就会出现卡顿、延迟甚至崩溃的情况:
1)执行时间超出预期或假死;
2)执行时产生大量的输出流内容。
[0003]
【发明内容】
:
为解决上述技术问题,本发明提供一种基于JAVA技术的调用外部可执行命令的系统,包括:构造工具模块,用于初始化系统;属性设置模块,用于设置系统运行时所需的各种参数;启动外部命令模块,用于启动外部应用命令;输出模块,用于获取并输出外部命令输出的标准流和错误流;超时判断模块,用于监控外部应用命令是否超时和是否终止;结果返回模块,用于返回系统的运行结果;存储模块,用于存储系统运行中需要存储的数据。
[0004]优选地,所述属性设置模块中的属性包括有,超时时长阀值、监听超时间隔、标准/异常输出流对象、输出模式、返回值属性。
[0005]优选地,所述启动外部命令模块通过JAVA API中的Runtime类的exec方法启动外部命令。
[0006]优选地,所述输出模块通过多线程的方式输出标准流和错误流。
[0007]优选地,所述输出模块输出标准流和错误流的方式分为单行读取输出和非单行读取输出,当输出的内容较少且输出的内容需要后续调用时选用单行读取方式,当输出的内容较多时选用非单行读取方式。
[0008]优选地,所述超时判断模块在上述启动外部命令模块启动外部命令的同时开始计时,以上述属性设置模块中所述监听超时间隔为周期,循环监听上述外部命令的返回状态,如果上述外部命令的返回状态显示外部系统执行完毕或发生异常或上述外部命令的返回状态在上述属性设置模块中所述超时时长阀值的时间内没有显示上述外部命令执行完毕,则直接结束上述外部命令,并调用上述结果返回模块。
[0009]另一方面,本发明还提供一种基于JAVA技术的调用外部可执行命令的方法,包括:调用构造函数;初始化系统运行时所需的各种属性参数;启动外部应用命令;获取并输出外部命令输出的标准流和错误流;监控外部应用命令是否超时和是否终止;返回系统的运行结果。
[0010]优选地,设置系统运行时所需的各种属性参数,其中所述各种参数包括设置超时时长阀值、设置监听超时间隔、设置标准/异常输出流对象、设置输出模式、设置返回值属性。
[0011]优选地,通过JAVA API中的Runtime类的exec (String s)方法启动外部命令。
[0012]优选地,通过多线程的方式输出标准流和错误流。
[0013]优选地,获取并输出标准流和错误流的方式分为单行读取输出和非单行读取输出,当输出的内容较少且输出的内容需要后续调用时选用单行读取方式,当输出的内容较多时选用非单行读取方式。
[0014]优选地,以上述监听超时间隔为周期,循环监听外部命令的返回状态,如果上述外部命令的返回状态显示外部命令执行完毕或发生异常或在上述超时时长阀值的时间内没有显示外部命令执行完毕,则结束上述外部命令,返回运行结果。
[0015]本发明基于java技术提供了一种使用java语言调用外部可执行程序的系统和方法,并且巧妙的使用询问机制,间隔的捕获特定异常,并抛出多线程输出标准流与错误流,彻底解决了外部应用程序在被java调用产生的大量输出流而导致的程序假死问题和超出预期的执行时间问题。
[0016]【附图说明】:
图1为本发明实施方式涉及的基于JAVA技术的调用外部可执行命令的系统的结构框图;
图2为本发明实施方式涉及的基于JAVA技术的调用外部可执行命令的方法的流程图;
图3为上述超时判断模块4运行时的流程图。
[0017]【具体实施方式】:
下面根据附图所示实施方式阐述本项发明。
[0018]图1显示了本发明实施方式涉及的基于JAVA技术的调用外部可执行命令的系统的结构框图。如图1所示,上述基于JAVA技术的调用外部可执行命令的系统包括构造工具模块1、属性设置模块2、启动外部命令模块3、输出模块4、超时判断模块5、结果返回模块6、存储模块7。其中,构造工具模块I用于初始化系统,属性设置模块2用于设置系统运行时所需的各种参数数据;启动外部命令模块3用于启动外部应用命令;输出模块4用于获取外部命令输出的标准流和错误流并输出上述外部命令输出的标准流和错误流;超时判断模块5用于监控外部命令是否超时和判断上述外部命令是否终止;结果返回模块6用于返回系统的运行结果;存储模块7用于存储系统运行中需要存储的数据。
[0019]在上述属性设置模块2中,所需要设置的参数数据包括超时时长阀值、监听超时间隔、标准/异常输出流对象、输出模式、返回值属性等,在系统开始运行时,首先调用上述构造工具模块I来初始化上述属性设置模块2中的上述参数数据,例如将上述超时时长阀值默认为O、上述监听超时间隔默认为O、上述输出模式默认为单行输出及上述返回值属性默认为异常等,并把上述参数数据存储在上述存储模块7中,供其他模块调用。
[0020]上述启动外部命令模块3通过JAVA API中的Runtime类的exec (String s)方法启动外部命令,并得到Process类的实例。所述Process类的实例可以用来控制上述外部命令的进程并获得相关信息。
[0021]上述输出模块4通过上述启动外部命令模块3中得到的所述Process类的实例得到上述外部命令运行后所输出的标准流和错误流,并将上述得到的标准流和错误流存储在上述初始化的标准/异常输出流对象中,再通过上述初始化的输出模式以多线程的方式分别读取并输出所述标准流和错误流。上述初始化的输出模式默认为单行读取的输出方式(readline),也可以采用非单行读取的输出方式,当上述外部命令输出内容较少且需要时,采用单行读取输出方式,当上述外部命令输出内容较多时,则采用非单行读取输出方式。
[0022]上述超时判断模块5在上述启动外部命令模块3启动外部命令的同时开始计时,再以上述属性设置模块2中所述监听超时间隔为周期,循环监听上述外部命令的返回状态,如果上述外部命令的返回状态显示外部系统执行完毕或发生异常或上述外部命令的返回状态在上述属性设置模块中所述超时时长阀值的时间内没有显示上述外部命令执行完毕,则直接结束上述外部命令,并调用上述结果返回模块。
[0023]图2为本发明实施方式涉及的基于JAVA技术的调用外部可执行命令的方法的流程图。下面参照图2说明在本实施方式涉及的基于JAVA技术的调用外部可执行命令的处理过程。
[0024]当系统开始运行时,首先由上述构造工具模块I调用构造函数(步骤SI),并上述属性设置模块2对上述构造函数中所用的参数进行初始化(步骤S2),即当系统运行时需要对上述构造函数中所用的参数进行初始化(步骤S2)。上述参数包括有超时时长阀值、监听超时间隔、标准/异常输出流对象、输出模式、返回值属性等。例如,对上述构造函数中
所用的参数进行初始化时,可以将上述超时时长阀值默认为O、上述监听超时间隔默认为
O、上述输出模式默认为单行输出及上述返回值属性默认为异常等,并把上述参数存储到上述存储模块7中。再由上述启动外部命令模块3通过JAVA API中的基础函数Runtime类的exec (String s)方法调用外部命令,并得到Process类的实例,所述Process类的实例可以用来控制上述外部命令的进程并获得相关信息(步骤S3)。上述输出模块4通过上述Process类的实例得到由上述启动外部命令模块3所调用的外部命令运行后输出的标准流和错误流,并将所得到的标准流和错误流存储在上述初始化的标准/异常输出流对象中,再实例化两个线程对象,通过上述实例化后的两个现成对象分别输出上述存储在标准/异常输出流对象中标准流和错误流(步骤S4)。在上述启动外部命令模块3调用外部命令的同时开始计时,并以上述监听超时间隔为周期,由上述超时判断模块5循环监听上述外部命令的返回结果。如果上述外部命令的返回结果为外部命令正常运行且运行时间没有超过上述超时时长阀值(步骤S5:否),则上述输出模块4继续获得上述外部命令的错误流和标准流,并输出上述外部命令的错误流和标准流。如果上述外部命令的返回结果为外部命令执行完毕而终止,或外部命令发生异常而终止,或外部命令运行的时间超过了上述超时时长阀值(步骤S5:是),则上述结果返回模块6结束上述外部命令的进程,最后设置并返回上述系统的运行结果(步骤S6)。
[0025]图3为本发明实施方式涉及的基于JAVA技术的调用外部可执行命令的系统的超时判断模块5运行时的流程图。下面参照图3说明在本实施方式涉及的基于JAVA技术的调用外部可执行命令的超时判断模块的处理过程。
[0026]在系统开始运行时初始化了超时判断模块需要调用的超时时长阀值η、监听超时间隔m,当上述启动外部命令模块3开始调用外部命令时开始计时,在本实施方式中设定当前计时时间为X (步骤S51),系统以上述监听超时间隔m为周期,由上述超时判断模块5循环监听上述外部命令的返回结果,当X % m !==0时(步骤S52:否),系统继续运行上述输出模块4,获得并输出上述外部命令输出的标准流和错误流,当x%m==0时(步骤S52:是),系统通过上述Process实例的exitValueO方法获得上述外部命令的返回结果(步骤S53)。如果上述超时判断模块5判断上述外部命令的返回结果为外部命令执行完毕(步骤S54:是),则上述结果返回模块6结束外部命令(步骤S57)。如果上述超时判断模块5判断上述外部命令的返回结果为外部命令未执行完毕(步骤S54:否),则判断外部命令是否发生异常(步骤S55)。如果上述超时判断模块5判断外部命令发生异常(步骤S55:是),则则上述结果返回模块6结束外部命令(步骤S57)。如果上述超时判断模块5判断上述外部命令没有发生异常(步骤S55:否),则判断上述运行时间有没有超过上述超时时长阀值(步骤S56)。如果上述超时判断模块5判断上述运行时间超过上述超时时长阀值(步骤S56:是),则上述结果返回模块6结束外部命令(步骤S57)。如果上述超时判断模块5判断上述运行时间没有超过上述超时时长阀值(步骤S56:否),则返回上述输出模块4。
[0027]在上述实施方式中,上述超时判断模块5按是否执行完毕、是否发生异常及是否超时的顺序来判断。但是,本发明并不限于此,也可以按是否发生异常、是否执行完毕及是否超时的顺序或其它顺序来判断。
[0028]应理解以上说明书中所描述的【具体实施方式】和实施例仅用于说明本发明而不用于限制本发明的范围。在阅读了本发明之后,本领域技术人员对本发明的各种等同形式的修改均落于本申请所附权利要求所限定的范围。
【主权项】
1.一种基于JAVA技术的调用外部可执行命令的系统,包括: 构造工具模块,用于初始化系统; 属性设置模块,用于设置系统运行时所需的各种参数; 启动外部命令模块,用于启动外部应用命令; 输出模块,用于获取并输出外部命令输出的标准流和错误流; 超时判断模块,用于监控外部应用命令是否超时和是否终止; 结果返回模块,用于返回系统的运行结果; 存储模块,用于存储系统运行中需要存储的数据。2.根据权利要求1所述的系统,其特征在于: 所述属性设置模块中的属性包括超时时长阀值、监听超时间隔、标准/异常输出流对象、输出模式、返回值属性。3.根据权利要求2所述的系统,其特征在于: 所述启动外部命令模块通过JAVA API中的Runtime类的exec方法启动外部命令。4.根据权利要求1-3所述的系统,其特征在于: 所述输出模块通过多线程的方式输出标准流和错误流。5.根据权利要求4所述的系统,其特征在于: 所述输出模块输出标准流和错误流的方式分为单行读取输出和非单行读取输出,当输出的内容较少且输出的内容需要后续调用时选用单行读取方式,当输出的内容较多时选用非单行读取方式。6.根据权利要求5所述的系统,其特征在于: 所述超时判断模块在所述启动外部命令模块启动外部命令的同时开始计时,以所述属性设置模块中所述监听超时间隔为周期,循环监听所述外部命令的返回状态,如果所述外部命令的返回状态显示外部系统执行完毕或发生异常或所述外部命令的返回状态在所述属性设置模块中所述超时时长阀值的时间内没有显示所述外部命令执行完毕,则直接结束所述外部命令,并调用所述结果返回模块。7.一种基于JAVA技术的调用外部可执行命令的方法,包括: 调用构造函数; 初始化系统运行时所需的各种属性参数; 启动外部应用命令; 获取并输出外部命令输出的标准流和错误流; 监控外部应用命令是否超时和是否终止; 返回系统的运行结果。8.根据权利要求7所述的方法,其特征在于: 设置系统运行时所需的各种属性参数,其中所述属性参数包括设置超时时长阀值、设置监听超时间隔、设置标准/异常输出流对象、设置输出模式、设置返回值属性。9.根据权利要求8所述的方法,其特征在于: 通过JAVA API中的Runtime类的exec方法启动外部命令。10.根据权利要求7-9所述的方法,其特征在于,还包括: 通过多线程的方式输出标准流和错误流。11.根据权利要求10所述的方法,其特征在于: 获取并输出标准流和错误流的方式分为单行读取输出和非单行读取输出,当输出的内容较少且输出的内容需要后续调用时选用单行读取方式,当输出的内容较多时选用非单行读取方式。12.根据权利要求11所述的方法,其特征在于: 以所述监听超时间隔为周期,循环监听外部命令的返回状态,如果所述外部命令的返回状态显示外部命令执行完毕或发生异常或在所述超时时长阀值的时间内没有显示外部命令执行完毕,则结束所述外部命令,返回运行结果。
【专利摘要】本发明提供一种基于JAVA技术的调用外部可执行命令的系统,包括:构造工具模块,用于初始化系统;属性设置模块,用于设置系统运行时所需的各种参数;启动外部命令模块,用于启动外部应用命令;输出模块,用于获取并输出外部命令输出的标准流和错误流;超时判断模块,用于监控外部命令是否超时和是否终止;结果返回模块,用于返回系统的运行结果;存储模块,用于存储系统运行中需要存储的数据。本发明还提供一种基于JAVA技术的调用外部可执行命令的调用方法。
【IPC分类】G06F9/46
【公开号】CN104899081
【申请号】CN201410082313
【发明人】黄镇
【申请人】无锡天脉聚源传媒科技有限公司
【公开日】2015年9月9日
【申请日】2014年3月7日