首页 / 专利库 / 人工智能 / 虚拟代理 / 数据采集方法及装置

数据采集方法及装置

阅读:852发布:2020-05-08

专利汇可以提供数据采集方法及装置专利检索,专利查询,专利分析的服务。并且本 发明 涉及应用监控技术领域,提供一种 数据采集 方法及装置。其中,数据采集方法用于采集基于Spring 框架 开发的Java应用程序中的数据,具体包括:利用实现了上下文获取 接口 的类对应的钩子对象获得由Spring框架主动注入的应用程序的上下文;根据上下文获得应用程序中使用的至少一个Spring Bean对象;从至少一个Spring Bean对象的成员中采集需要监控的数据。在上述方法中,应用程序的上下文是被Spring框架主动注入钩子对象的,因此应用程序本身无需做任何 修改 ,监控逻辑与应用程序的业务逻辑是分离的,有利于代码的维护管理。,下面是数据采集方法及装置专利的具体信息内容。

1.一种数据采集方法,用于采集基于Spring框架开发的Java应用程序中的数据,其特征在于,包括:
利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的所述应用程序的上下文,其中,所述上下文获取接口由Spring框架提供;
根据所述上下文获得所述应用程序中使用的至少一个Spring Bean对象;
从所述至少一个Spring Bean对象的成员中采集需要监控的数据。
2.根据权利要求1所述的数据采集方法,其特征在于,包含所述钩子对象对应的类的jar包部署于所述应用程序的第三方类库目录下,在所述应用程序启动时随所述应用程序的jar包一同加载。
3.根据权利要求1所述的数据采集方法,其特征在于,所述根据所述上下文获得所述应用程序中使用的至少一个Spring Bean对象,包括:
在基于Java Instrumentation构建的代理程序中,获得被注入所述钩子对象的所述上下文,并根据所述上下文获得所述至少一个Spring Bean对象。
4.根据权利要求3所述的数据采集方法,其特征在于,所述获得被注入所述钩子对象的所述上下文,并根据所述上下文获得所述应用程序中使用的至少一个Spring Bean对象,包括:
获得运行所述应用程序的Java虚拟机的类加载器;
根据预先配置好的所述钩子对象对应的类的路径,利用所述类加载器映射获得所述钩子对象对应的类;
根据所述钩子对象对应的类以及所述钩子对象的名称,利用Java的反射机制获得所述钩子对象,进而获得被注入所述钩子对象的所述上下文;
根据所述上下文获得所述至少一个Spring Bean对象对应的类的路径以及所述至少一个Spring Bean对象的名称;
根据所述至少一个Spring Bean对象对应的类的路径,利用所述类加载器映射获得所述至少一个Spring Bean对象对应的类;
根据所述至少一个Spring Bean对象对应的类以及所述至少一个Spring Bean对象的名称,利用Java的反射机制获得所述至少一个Spring Bean对象。
5.根据权利要求3所述的数据采集方法,其特征在于,所述获得被注入所述钩子对象的所述上下文,并根据所述上下文获得所述应用程序中使用的至少一个Spring Bean对象,包括:
获得运行所述应用程序的Java虚拟机的类加载器;
利用所述类加载器获得所述应用程序运行过程中需要被加载的多个类以及所述多个类的路径,进而获得所述多个类与所述多个类的路径之间的映射关系;
根据预先配置好的所述钩子对象对应的类的路径,利用所述映射关系查询获得所述钩子对象对应的类;
根据所述钩子对象对应的类以及所述钩子对象的名称,利用Java的反射机制获得所述钩子对象,进而获得被注入所述钩子对象的所述上下文;
根据所述上下文获得所述至少一个Spring Bean对象对应的类的路径以及所述至少一个Spring Bean对象的名称;
根据所述至少一个Spring Bean对象对应的类的路径,利用所述映射关系查询获得所述至少一个Spring Bean对象对应的类;
根据所述至少一个Spring Bean对象对应的类以及所述至少一个Spring Bean对象的名称,利用Java的反射机制获得所述至少一个Spring Bean对象。
6.根据权利要求4或5所述的数据采集方法,其特征在于,所述Spring Bean对象的成员中包括成员对象,从所述Spring Bean对象的成员中采集需要监控的数据,包括:
根据所述Spring Bean对象获得所述成员对象对应的类以及所述成员对象的名称;
根据所述成员对象对应的类以及所述成员对象的名称,利用Java的反射机制获得所述成员对象;
从所述成员对象中采集需要监控的数据。
7.根据权利要求4或5所述的数据采集方法,其特征在于,所述Spring Bean对象对应的类中包括静态成员,在获得所述Spring Bean对象对应的类之后,所述方法还包括:
根据所述Spring Bean对象对应的类获得所述静态成员;
从所述静态成员中采集需要监控的数据。
8.根据权利要求7所述的数据采集方法,其特征在于,所述静态成员包括静态对象,根据所述Spring Bean对象对应的类获得所述静态成员,包括:
根据所述Spring Bean对象对应的类获得所述静态对象对应的类以及所述静态对象的名称;
根据所述静态对象对应的类以及所述静态对象的名称,利用Java的反射机制获得所述静态对象。
9.根据权利要求1-5中任一项所述的数据采集方法,其特征在于,所述从所述至少一个Spring Bean对象中采集需要监控的数据之后,所述方法还包括:
将采集到的数据发送至数据需求方的进程
10.根据权利要求1-5中任一项所述的数据采集方法,其特征在于,所述上下文获取接口为ApplicationContextAware接口。
11.一种数据采集装置,用于采集基于Spring框架开发的Java应用程序中的数据,其特征在于,包括:
上下文获取模,用于利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的所述应用程序的上下文,其中,所述上下文获取接口由Spring框架提供;
对象获取模块,根据所述上下文获得所述应用程序中使用的至少一个Spring Bean对象;
数据获取模块,用于从所述至少一个Spring Bean对象的成员中采集需要监控的数据。

说明书全文

数据采集方法及装置

技术领域

[0001] 本发明涉及应用监控技术领域,具体而言,涉及一种数据采集方法及装置。

背景技术

[0002] 在信息科学和系统控制领域,应用监控管理致于监控和管理应用软件性能、可用性和业务准确性。通过监测和诊断复杂应用程序的性能及业务问题,来保证软件应用程序的良好运行,并协助定位分析问题。
[0003] 从企业应用的开发框架维度分析,目前市场上绝大部分Java应用都采用了Spring容器框架。为了监控这些应用程序的运行时数据,目前的做法通常需要修改Java应用程序的源代码或者字节码,添加相应的监控数据采集代码,监控逻辑与应用程序的业务逻辑紧密耦合,导致代码维护困难。

发明内容

[0004] 有鉴于此,本发明实施例提供一种数据采集方法及装置,该方法无需修改应用程序的源代码或字节码即可实现监控数据的采集。
[0005] 为实现上述目的,本发明提供如下技术方案:
[0006] 第一方面,本发明实施例提供一种数据采集方法,用于采集基于Spring框架开发的Java应用程序中的数据,包括:
[0007] 利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的应用程序的上下文,其中,上下文获取接口由Spring框架提供;
[0008] 根据上下文获得应用程序中使用的至少一个Spring Bean对象;
[0009] 从至少一个Spring Bean对象的成员中采集需要监控的数据。
[0010] 上述方法通过钩子对象获取应用程序的上下文,进而获得应用程序中使用的至少一个Spring Bean对象,然后从Spring Bean对象的成员中采集需要监控的数据。其中,应用程序的上下文是被Spring框架主动注入钩子对象的,因此应用程序本身无需做任何修改,从而监控逻辑(指监控数据的采集)与应用程序的业务逻辑是分离的,有利于代码的维护管理。
[0011] 结合第一方面,在第一方面的第一种可能的实现方式中,包含钩子对象对应的类的jar包部署于应用程序的第三方类库目录下,在应用程序启动时随应用程序的jar包一同加载。
[0012] 实现钩子对象对应的类的代码可以作为独立的jar包进行部署,对于需要监控的应用程序,只需要将该jar包放到应用程序的第三方类库目录下即可,是一种低侵入的数据采集方式,同时便于数据采集的代码复用。
[0013] 结合第一方面,在第一方面的第二种可能的实现方式中,根据上下文获得应用程序中使用的至少一个Spring Bean对象,包括:
[0014] 在基于Java Instrumentation构建的代理程序中,获得被注入钩子对象的上下文,并根据上下文获得至少一个Spring Bean对象。
[0015] 监控逻辑可以在钩子对象中实现,同时也可以在另一个代理程序中实现,而钩子对象只用于获得应用程序的上下文,这样可以避免影响应用程序的性能。
[0016] 结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,获得被注入钩子对象的上下文,并根据上下文获得应用程序中使用的至少一个Spring Bean对象,包括:
[0017] 获得运行应用程序的Java虚拟机的类加载器;
[0018] 根据预先配置好的钩子对象对应的类的路径,利用类加载器映射获得钩子对象对应的类;
[0019] 根据钩子对象对应的类以及钩子对象的名称,利用Java的反射机制获得钩子对象,进而获得被注入钩子对象的上下文;
[0020] 根据上下文获得至少一个Spring Bean对象对应的类的路径以及至少一个Spring Bean对象的名称;
[0021] 根据至少一个Spring Bean对象对应的类的路径,利用类加载器映射获得至少一个Spring Bean对象对应的类;
[0022] 根据至少一个Spring Bean对象对应的类以及至少一个Spring Bean对象的名称,利用Java的反射机制获得至少一个Spring Bean对象。
[0023] 以上为获取Srping Bean对象的一种方式,在该方式中,每获得一个类的路径后,都需要通过类加载器将类的路径映射为相应的类。
[0024] 结合第一方面的第二种可能的实现方式,在第一方面的第四种可能的实现方式中,获得被注入钩子对象的上下文,并根据上下文获得应用程序中使用的至少一个Spring Bean对象,包括:
[0025] 获得运行应用程序的Java虚拟机的类加载器;
[0026] 利用类加载器获得应用程序运行过程中需要被加载的多个类以及多个类的路径,进而获得多个类与多个类的路径之间的映射关系;
[0027] 根据预先配置好的钩子对象对应的类的路径,利用映射关系查询获得钩子对象对应的类;
[0028] 根据钩子对象对应的类以及钩子对象的名称,利用Java的反射机制获得钩子对象,进而获得被注入钩子对象的上下文;
[0029] 根据上下文获得至少一个Spring Bean对象对应的类的路径以及至少一个Spring Bean对象的名称;
[0030] 根据至少一个Spring Bean对象对应的类的路径,利用映射关系查询获得至少一个Spring Bean对象对应的类;
[0031] 根据至少一个Spring Bean对象对应的类以及至少一个Spring Bean对象的名称,利用Java的反射机制获得至少一个Spring Bean对象。
[0032] 以上为获取Srping Bean对象的另一种方式,在该方式中,首先获得类加载器需要加载的多个类与多个类的路径之间的映射关系,之后需要通过某个类的路径查找某个类时,直接利用该映射关系进行查询即可,效率较高。
[0033] 结合第一方面的第三种或第四种可能的实现方式,在第一方面的第五种可能的实现方式中,Spring Bean对象的成员中包括成员对象,从Spring Bean对象的成员中采集需要监控的数据,包括:
[0034] 根据Spring Bean对象获得成员对象对应的类以及成员对象的名称;
[0035] 根据成员对象对应的类以及成员对象的名称,利用Java的反射机制获得成员对象;
[0036] 从成员对象中采集需要监控的数据。
[0037] 对于Srping Bean对象的成员是普通变量(基本数据类型)的情况,可以直接获取需要监控的数据,对于Srping Bean对象的成员是对象的情况,还需要先反射获得成员对象,再进一步获得成员对象中的数据。
[0038] 结合第一方面的第三种或第四种可能的实现方式,在第一方面的第六种可能的实现方式中,Spring Bean对象对应的类中包括静态成员,在获得Spring Bean对象对应的类之后,方法还包括:
[0039] 根据Spring Bean对象对应的类获得静态成员;
[0040] 从静态成员中采集需要监控的数据。
[0041] 静态成员附属于Spring Bean对象对应的类,因此在获得Spring Bean对象对应的类以后就可以监控静态成员的数据。
[0042] 结合第一方面的第六种可能的实现方式,在第一方面的第七种可能的实现方式中,静态成员包括静态对象,根据Spring Bean对象对应的类获得静态成员,包括:
[0043] 根据Spring Bean对象对应的类获得静态对象对应的类以及静态对象的名称;
[0044] 根据静态对象对应的类以及静态对象的名称,利用Java的反射机制获得静态对象。
[0045] 对于静态成员是普通变量(基本数据类型)的情况,可以直接获取需要监控的数据,对于静态成员是对象的情况,还需要先反射获得静态对象,再进一步获得静态对象中的数据。
[0046] 结合第一方面或第一方面的第一种或第四种中的任意一种可能的实现方式,在第一方面的第八种可能的实现方式中,从至少一个Spring Bean对象中采集需要监控的数据之后,方法还包括:
[0047] 将采集到的数据发送至数据需求方的进程
[0048] 具体的数据发送方式可以是主动发送,也可以是提供数据采集接口,由数据需求方的进程调用该接口来获取数据,当然还可以是其他方式,可以根据需求灵活确定。
[0049] 结合第一方面或第一方面的第一种或第四种中的任意一种可能的实现方式,在第一方面的第九种可能的实现方式中,上下文获取接口为ApplicationContextAware接口。
[0050] 第二方面,本发明实施例提供一种数据采集装置,用于采集基于Spring框架开发的Java应用程序中的数据,包括:
[0051] 上下文获取模,用于利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的应用程序的上下文,其中,上下文获取接口由Spring框架提供;
[0052] 对象获取模块,根据上下文获得应用程序中使用的至少一个Spring Bean对象;
[0053] 数据获取模块,用于从至少一个Spring Bean对象的成员中采集需要监控的数据。
[0054] 第三方面,本发明实施例提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行第一方面或第一方面的任意一种可能的实现方式提供的方法的步骤。
[0055] 第四方面,本发明实施例提供一种电子设备,包括存储器以及处理器,存储器中存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行第一方面或第一方面的任意一种可能的实现方式提供的方法的步骤。
[0056] 为使本发明的上述目的、技术方案和有益效果能更明显易懂,下文特举实施例,并配合所附附图,作详细说明如下。

附图说明

[0057] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0058] 图1示出了本发明实施例提供的数据采集方法的流程图
[0059] 图2示出了本发明实施例提供的数据采集方法的一种实现方式的示意图;
[0060] 图3示出了本发明实施例提供的数据采集方法的步骤S11的一种流程图;
[0061] 图4示出了本发明实施例提供的数据采集方法的步骤S11的一种流程图;
[0062] 图5示出了本发明实施例提供的数据采集装置的功能模块图。

具体实施方式

[0063] 在现有技术中,通常采用两种方法采集需要监控的Java应用程序在运行过程中的数据。
[0064] 第一种方法,通过在应用程序的源代码中加入数据采集相关逻辑代码以实现数据的采集。发明人在长期研究实践中发现,此方案有两大缺点,第一,需要修改应用程序的源代码,监控逻辑与应用程序的业务逻辑耦合在一起,不利于代码维护;第二,对于不同的应用程序需要分别修改其源代码,监控逻辑的代码无法复用,开发工作量大,开发成本高。
[0065] 第二种方法,通过修改应用程序的源代码编译后产生的字节码,添加相应的监控逻辑。发明人在长期研究实践中发现,此方案未能从根本上解决第一种方案的问题,此外还有两大缺点,第一,应用程序的字节码文件被篡改,险巨大,如果篡改有问题可能导致应用程序不可用;第二,该方法的技术槛很高,需要对应用程序本身有很深入的了解,同时字节码编码复杂,开发人员培训成本高。
[0066] 现有技术中存在的上述缺陷,是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本发明实施例针对上述问题所提出的解决方案,都应该是发明人在本发明过程中对本发明做出的贡献。
[0067] 下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0068] 应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于将一个实体或者操作与另一个实体或操作区分开来,而不能理解为指示或暗示相对重要性,也不能理解为要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0069] 本发明实施例提供一种如图1所示的数据采集方法。该方法用于采集基于Spring框架开发的Java应用程序中的数据,这里所称的数据是指需要被监控的数据,在基于Spring框架开发的Java应用程序,数据通常保存在Spring Bean对象中。参照图1,该方法包括:
[0070] 步骤S10:利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的应用程序的上下文。
[0071] 其 中 ,上 下 文 获 取 接 口 由 S p r i n g 框 架 提 供 ,例 如 ,可 以 是ApplicationContextAware接口,在该接口的定义中包括一个setApplicationContext方法,该方法包括一个类型为ApplicationContext类的参数。
[0072] 为简化阐述,将实现了上下文获取接口的类称为钩子类,其对应的对象称为钩子对象。在应用程序启动,所有Spring Bean对象被初始化后,Spring框架会主动调用钩子对象的setApplicationContext方法,将应用程序的上下文(一个ApplicationContext类的对象)注入到钩子对象,从而钩子对象可以获得应用程序的上下文。
[0073] 步骤S11:根据上下文获得应用程序中使用的至少一个Spring Bean对象。
[0074] 应用程序的上下文中包含了应用程序中使用的所有Spring Bean对象的信息,因此应用程序中使用的所有Spring Bean对象都能够根据上下文获取到。步骤S11中的至少一个Spring Bean对象可以是应用程序中使用的所有Spring Bean对象,也可以是根据需求确定的所有Spring Bean对象中的部分Spring Bean对象。
[0075] 步骤S12:从至少一个Spring Bean对象的成员中采集需要监控的数据。
[0076] 对于应用程序而言,数据主要保存在Spring Bean对象的成员中,例如,某个成员变量在某个时刻的取值就是一种数据。从而,一旦获得了Spring Bean对象,就可以采集到需要监控的数据。
[0077] 在上述方法中,应用程序的上下文是被Spring框架主动注入钩子对象的,在获取到上下文后,监控逻辑的代码会根据上下文采集到需要监控的数据,而应用程序本身的业务逻辑代码无需做任何修改,从而实现了监控逻辑与业务逻辑的分离,有利于代码的维护管理。此外,该方法可以通过普通的Java编程实现,不涉及现有技术中的字节码操作,其技术门槛不高,易于普通技术人员进行实施。
[0078] 在本发明的一个实施例中,包含钩子类的jar包部署于应用程序的第三方类库目录下,在应用程序启动时随应用程序的jar包一同加载。若应用程序部署在tomcat下,第三方类库目录可以是:%TOMCAT_HOME目录%/webapps/%应用程序目录%/WEB-INF/lib/,只要第三方的jar包被放入该目录下,在应用程序启动时,Java虚拟机将自动会加载第三方的jar包。包含钩子类的jar包被加载后,钩子对象将被创建,同时Spring框架会主动将应用程序的上下文注入到钩子对象。
[0079] 对于每个需要监控的应用程序,只需要将包含钩子类的jar包放到应用程序的第三方类库目录下即可,其操作十分简单,是一种低侵入的数据采集方式。同时,该jar包对于不同的被监控应用程序是可以复用的,能够有效降低开发成本。
[0080] 进一步的,监控逻辑(主要包括步骤S11以及步骤S12)可以在钩子对象中实现,也可以在一个基于Java Instrumentation构建的代理程序中实现,该代理程序从获得被注入钩子对象的上下文,然后执行监控逻辑。采用后一种实现方式的主要考虑是避免钩子对象的逻辑过于复杂,影响应用程序的性能。
[0081] Java Instrumentation是Java SE 5中引入的新特性,代理程序实际上就是基于Java Instrumentation实现的一个代理类,代理类应当实现premain方法。编写好的代理类打成一个jar包,并配置启动参数,配置完成后可以重启应用程序,以便该jar包被加载,启动代理服务。若应用程序部署在tomcat下,代理程序可以配置如下启动参数:
[0082] CATALINA_OPTS="¥CATALINA_OPTS-javaagent:
[0083] ¥AGENT_PATH/debug-bootstrap-¥VERSION.jar"
[0084] CATALINA_OPTS="¥CATALINA_OPTS-Ddebug.nodeId=node1"[0085] CATALINA_OPTS="¥CATALINA_OPTS-Ddebug.appName=app1"[0086] 其中,第二行的jar包即代理类所在的jar包。需要指出,代理类的实现以及加载方式并非唯一的,例如,在JavaSE6中,代理类应当实现agentmain方法,同时可以通过Java Tool API在应用程序启动后动态地添加代理。
[0087] 图2示出了本发明实施例提供的数据采集方法的一种实现方式的示意图。参照图2,数据需求方的进程需要从N个被监控的应用程序获取数据(左侧),每个应用程序的监控方法都是相同的(右侧),在应用程序中嵌入一个钩子对象,同时用一个对应的代理程序采集需要监控的数据,并将数据发送给数据需求方的进程。
[0088] 在发送数据时,可以采用主动以及被动两种方式。主动方式,例如,代理程序定期将采集到的数据上报给数据需求方的进程;被动方式,例如,代理程序提供一个数据采集接口,由数据需求方的进程调用该接口来获取数据。
[0089] 数据需求方的进行在接收到数据后,可以进行进一步处理,例如,进行存储或者上报给上层逻辑处理,可以理解的,数据需求方的行为在本发明实施例中是不作限定的。
[0090] 在本发明的一个实施例中,代理程序可以采用图3示出的方式实现步骤S11。参照图3,步骤S11可以包括:
[0091] 步骤S110a:获得运行应用程序的Java虚拟机的类加载器。
[0092] 类加载器(ClassLoader)用于加载应用程序中所要使用的所有的类。通过类加载器可以获得其中任意一个类以及该类的路径,同时还可以利用一个类的路径映射获得该类。对于代理程序而言,被代理的应用程序的类加载器是可以获得的。
[0093] 步骤S111a:根据预先配置好的钩子对象对应的类的路径,利用类加载器映射获得钩子对象对应的类。
[0094] 步骤S112a:根据钩子对象对应的类以及钩子对象的名称,利用Java的反射机制获得钩子对象,进而获得被注入钩子对象的上下文。
[0095] 由于钩子类是为实现数据采集专门开发的,因此钩子类的路径和钩子对象的名称都是已知的。可以将其直接写在代码中,当然也可以保存在配置文件中,随时读取。在Java中,获得了某个对象的名称以及该对象的类,利用Java的反射机制即可以获得该对象,因此先利用类加载器将钩子类的路径映射为钩子类,再结合钩子对象的名称,利用反射就可以获得钩子对象,获得钩子对象后,被注入钩子对象的应用程序的上下文自然也就可以获取了。
[0096] 步骤S113a:根据上下文获得至少一个Spring Bean对象对应的类的路径以及至少一个Spring Bean对象的名称。
[0097] 步骤S114a:根据至少一个Spring Bean对象对应的类的路径,利用类加载器映射获得至少一个Spring Bean对象对应的类。
[0098] 步骤S115a:根据至少一个Spring Bean对象对应的类以及至少一个Spring Bean对象的名称,利用Java的反射机制获得至少一个Spring Bean对象。
[0099] 之前已经提到过,上下文中包含了应用程序中使用的所有Spring Bean对象的信息,这里所称的信息包括Spring Bean对象对应的类的路径以及Spring Bean对象的名称,和获取钩子对象的过程类似,先利用类加载器将Spring Bean对象对应的类的路径映射为Spring Bean对象对应的类,在结合Spring Bean对象的名称,利用反射就可以获得Spring Bean对象了。
[0100] 在上述获取Srping Bean对象的方式中,每获得一个类的路径后,都需要通过类加载器将类的路径映射为相应的类。
[0101] 在本发明的一个实施例中,代理程序可以采用图4示出的方式实现步骤S11。参照图4,步骤S11可以包括:
[0102] 步骤S110b:获得运行应用程序的Java虚拟机的类加载器。
[0103] 步骤S111b:利用类加载器获得应用程序运行过程中需要被加载的多个类以及多个类的路径,进而获得多个类与多个类的路径之间的映射关系。
[0104] 步骤S112b:根据预先配置好的钩子对象对应的类的路径,利用映射关系查询获得钩子对象对应的类。
[0105] 步骤S113b:根据钩子对象对应的类以及钩子对象的名称,利用Java的反射机制获得钩子对象,进而获得被注入钩子对象的上下文。
[0106] 步骤S114b:根据上下文获得至少一个Spring Bean对象对应的类的路径以及至少一个Spring Bean对象的名称。
[0107] 步骤S115b:根据至少一个Spring Bean对象对应的类的路径,利用映射关系查询获得至少一个Spring Bean对象对应的类。
[0108] 步骤S116b:根据至少一个Spring Bean对象对应的类以及至少一个Spring Bean对象的名称,利用Java的反射机制获得至少一个Spring Bean对象。
[0109] 上述获取Srping Bean对象的方式和图3示出的方式其实比较类似。区别在于,首先获得类加载器需要加载的多个类与多个类的路径之间的一一映射关系并缓存,之后需要通过某个类的路径查找某个类时,直接利用缓存的映射关系进行查询即可,效率较高。其中,对于映射关系的缓存可以采用键值对等数据结构。
[0110] 对于Srping Bean对象的成员是普通变量(基本数据类型的变量,如byte、int类型的变量)的情况,在步骤S12中可以直接获取需要监控的数据,对于Srping Bean对象的成员是对象的情况,还需要先反射获得成员对象,再进一步获得成员对象中的数据。在本发明的一个实施例中,可以采用如下方式处理:
[0111] 由于成员对象是属于Spring Bean对象的,因此所有成员对象对应的类以及成员对象的名称都可以通过其从属的Spring Bean对象获得,进而再通过Java的反射机制就可以获得成员对象。获得成员对象后,可以采集成员对象中的数据。如果成员对象中还嵌套有成员对象,可以用类似的方法进行处理,不再重复阐述。
[0112] 被监控的数据除了来源于Spring Bean对象外,还可能来源于Spring Bean对象对应的类的静态成员(具有static关键字的成员)。在本发明的一个实施例中,可以从这些静态成员中采集需要监控的数据。
[0113] 由于静态成员从属于Spring Bean对象对应的类,因此在获得Spring Bean对象对应的类(如步骤S114a、步骤S115b)之后,就可以获得静态成员,进而从静态成员中采集数据。
[0114] 对于静态成员是普通变量的情况,可以直接获取需要监控的数据,对于静态成员是对象的情况,还需要先反射获得静态对象,再进一步获得静态对象中的数据。
[0115] 由于静态成员从属于Spring Bean对象对应的类的,因此所有静态对象对应的类以及静态对象的名称都可以通过其从属的Spring Bean对象对应的类获得,进而再通过Java的反射机制就可以获得静态对象。获得静态对象后,可以采集静态对象中的数据。如果静态对象中嵌套有静态对象或成员对象,或者成员对象中嵌套有静态对象,结合上面的阐述,均可以得到处理,可采集的数据范围十分广泛。
[0116] 本发明实施例还提供一种如图5所示的数据采集装置100。参照图5,该装置用于采集基于Spring框架开发的Java应用程序中的数据,具体包括:
[0117] 上下文获取模块110,用于利用实现了上下文获取接口的类对应的钩子对象获得由Spring框架主动注入的应用程序的上下文,其中,上下文获取接口由Spring框架提供;
[0118] 对象获取模块120,根据上下文获得应用程序中使用的至少一个Spring Bean对象;
[0119] 数据获取模块130,用于从至少一个Spring Bean对象的成员中采集需要监控的数据。
[0120] 本发明实施例提供的数据采集装置100,其实现原理及产生的技术效果在前述方法实施例中已经介绍,为简要描述,装置实施例部分未提及之处,可参考方法施例中相应内容。
[0121] 本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行本发明实施例提供的数据采集方法的步骤。
[0122] 本发明实施例还提供一种电子设备,包括存储器以及处理器,存储器中存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行本发明实施例提供的数据采集方法的步骤。
[0123] 需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0124] 本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其他的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0125] 另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
[0126] 所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得计算机设备执行本发明各个实施例所述方法的全部或部分步骤。前述的计算机设备包括:个人计算机、服务器、移动设备、智能穿戴设备、网络设备、虚拟设备等各种具有执行程序代码能力的设备,前述的存储介质包括:U盘、移动硬盘只读存储器随机存取存储器、磁碟、磁带或者光盘等各种可以存储程序代码的介质。
[0127] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈