在Java应用中测量用户资源使用量的方法与装置制造方法

文档序号:7999193阅读:158来源:国知局
在Java应用中测量用户资源使用量的方法与装置制造方法
【专利摘要】本发明公开了一种在Java应用中测量用户资源使用量的方法与装置。该方法包括:响应于接收到用户发起的Java应用访问请求,从应用访问请求中,识别用户身份信息;在根据业务逻辑处理Java应用访问请求的过程中,调用Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与Java系统资源类单元相对应的资源测量代码单元,资源测量代码单元在Java系统资源类单元被调用的过程中,测量调用Java系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中。本发明提供的技术方案能够在Java应用中准确方便地测量用户实际所占用的系统资源使用量。
【专利说明】在Java应用中测量用户资源使用量的方法与装置

【技术领域】
[0001] 本发明涉及计算机应用领域,特别涉及一种在Java应用中测量用户资源使用量 的方法与装置。

【背景技术】
[0002] 多租户Java应用是基于Java应用软件平台,向多个租户同时提供在线服务的软 件即服务(Software-as-a-service, SaaS)应用。
[0003] 租户按需使用应用平台提供的应用服务,应用平台按租户使用量对其进行计费, 例如,按照使用时间或者服务种类计费。一个租户下可能包含多个用户。在使用服务的过 程中,租户中的用户通过托管应用程序与应用平台建立单独的会话,使用应用平台提供的 服务。应用平台通过提供应用实例为用户提供服务,用户将占用应用平台的CPU、内存等系 统资源。
[0004] 在多用户应用或者大型应用中,由于多个用户共享相同的应用实例,每个应用实 例可能需要为一部分用户提供应用服务,因此,在这种情况下,不同的用户可能使用相同的 系统资源,如何准确地测量每个用户实际使用的系统资源是非常困难的。现有技术中,测量 用户占用系统资源量的方法主要有以下两种。
[0005] 一种是服务资源估算法,即预先估算用户需要使用的每个服务大致所要占用的系 统资源量,将用户每次调用的服务的系统资源进行累加,累加的是一段时间内某类资源的 估算均值。例如,估计用户将使用的服务i,服务i的调用次数为Ni,服务i消耗的CPU周 期数为Ci,总共用η服务,则用户消耗的CPU资源为2Ci*Ni,i=l,2…η。可见,由于这种方 法所获得的用户系统资源的使用量为粗略的估算结果,因此,资源测量的精度低。
[0006] 还有一种方法是使用专用资源应用程序编程接口(Application Programming Interface,API)进行测量。由应用平台提供测量资源的专用API,在应用程序需要测量资 源的地方显式调用测量资源API进行资源测量。这种方法由于需要使用应用平台提供的专 用测量API,应用平台托管的每个应用都需要显式调用该专用API接口,因此,托管应用难 以移植,增加了应用开发的工作量。


【发明内容】

[0007] 根据本发明实施例的一个方面,所要解决的一个技术问题是:提供一种在多用户 Java应用中测量用户资源使用量的方法与装置,在多用户Java应用中方便准确地测量每 个用户实际所使用的系统资源。
[0008] 本发明实施例提供的一种在Java应用中测量用户资源使用量的方法,所述方法 包括:
[0009] 响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述 用户身份信息;
[0010] 在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问 请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资 源类单元相对应的资源测量代码单元;
[0011] 所述资源测量代码单元在所述Java系统资源类单元被调用的过程中,测量调用 所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所 述用户身份信息相对应的计数信息中。
[0012] 优选地,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述 方法还包括:
[0013] 根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类 单元;
[0014] 识别是否已经加载所述Java系统资源类单元;
[0015] 若已经加载所述Java系统资源类单元,执行所述调用所述Java应用访问请求所 需要的Java系统资源类单元的操作;否则,将所述资源测量代码单元注入到对应的原始 Java系统资源类单元中,生成所述Java系统资源类单元,并加载生成的所述Java系统资源 类单元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作。
[0016] 优选地,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件 读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为 CPU占用时间、内存占用大小、10数据量大小中的至少一种。
[0017] 优选地,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为 CPU占用时间;
[0018] 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
[0019] 在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的 CPU时钟周期个数,作为所述CPU占用时间。
[0020] 优选地,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内 存占用大小;
[0021] 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
[0022] 在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大 小,作为所述内存占用大小。
[0023] 优选地,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为10 数据量大小:
[0024] 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
[0025] 在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据 量大小,作为所述10数据量大小;或者
[0026] 在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据 量大小,作为所述10数据量大小。
[0027] 优选地,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述 方法还包括:
[0028] 利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,所述 对象单元包含所述资源测量代码单元;
[0029] 响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需 要的对象单元;
[0030] 利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资 源类单元。
[0031] 优选地,所述方法还包括:
[0032] 将所述用户身份信息写入与所述用户身份信息向对应的用户上下文信息中;
[0033] 所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所 述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
[0034] 优选地,所述用户身份信息为所述用户所属的租户标识;
[0035] 所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
[0036] 本发明所提供的一种在Java应用中测量用户资源使用量的装置,所述装置包括:
[0037] 应用服务入口单元,用于响应于接收到用户发起的Java应用访问请求,从所述应 用访问请求中,识别所述用户身份信息;
[0038] 应用业务逻辑单元,用于根据业务逻辑处理所述Java应用访问请求,在根据业务 逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系 统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源 测量代码单元;
[0039] 资源测量代码单元,用于在所述Java系统资源类单元被调用的过程中,测量调用 所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所 述用户身份信息相对应的计数信息中。
[0040] 优选地,所述应用业务逻辑单元,还用于在调用所述Java应用访问请求所需要的 Java系统资源类单元之前,根据应用业务逻辑,分析获得所述Java应用访问请求所需要的 Java系统资源类单元;识别是否已经加载所述Java系统资源类单元;响应于已经加载所 述Java系统资源类单元,调用所述Java应用访问请求所需要的Java系统资源类单元的操 作;
[0041] 资源类转换器单元,用于响应于未加载所述Java系统资源类单元,将所述资源测 量代码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元;
[0042] 类加载器单元,用于加载生成的所述Java系统资源类单元。
[0043] 优选地,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件 读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为 CPU占用时间、内存占用大小、10数据量大小中的至少一种。
[0044] 优选地,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为 CPU占用时间;
[0045] 所述资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时, 测量运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
[0046] 优选地,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内 存占用大小;
[0047] 所述资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时, 测量所述对象子类所占用的内存大小,作为所述内存占用大小。
[0048] 优选地,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为10 数据量大小:
[0049] 所述资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行 时,测量所述输入流子类读取的数据量大小,作为所述10数据量大小;或者在调用文件读 写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述10数 据量大小。
[0050] 优选地,所述装置还包括:
[0051] Java应用容器单元,用于在调用所述Java应用访问请求所需要的Java系统资源 类单元之前,利用对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述 资源测量代码单元;
[0052] 所述应用业务逻辑单元,还用于响应于所述Java应用访问请求,从所述测量系 统资源类的对象单元中选择所需要的对象单元;利用所选择的对象单元的定义创建所述 Java应用访问请求所需要的Java系统资源类单元。
[0053] 优选地,所述装置还包括:
[0054] 上下文信息管理单元,用于将所述用户身份信息写入与所述用户身份信息向对应 的用户上下文信息中;
[0055] 所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所 述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
[0056] 优选地,所述用户身份信息为所述用户所属的租户标识;
[0057] 所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
[0058] 基于本发明上述实施例提供的在Java应用中测量用户资源使用量的方法与装 置,响应于接收到用户发起的Java应用访问请求,识别用户身份信息,调用Java应用访问 请求所需要的Java系统资源类单元,通过在Java系统资源类单元中包含与Java系统资 源类单元相对应的资源测量代码单元,从而能够在Java系统资源类单元被调用的过程中, 利用资源测量代码单元准确地测量用户实际所占用的系统资源使用量,并将系统资源使用 量记录在与用户身份信息相对应的计数信息中,从而有效提升了用户资源使用量的测量精 度,同时,避免了依赖于专用API,不需要修改现有应用程序,便于应用的快速移植。
[0059] 通过以下参照附图对本发明的示例性实施例的详细描述,本发明的其它特征及其 优点将会变得清楚。

【专利附图】

【附图说明】
[0060] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可 以根据这些附图获得其他的附图。
[0061] 同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际 的比例关系绘制的。相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一 个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。
[0062] 构成说明书的一部分的附图描述了本发明的实施例,并且连同说明书一起用于解 释本发明的原理。
[0063] 参照附图,根据下面的详细描述,可以更加清楚地理解本发明,其中:
[0064] 图1示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例 的流程示意图;
[0065] 图2示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例 的流程示意图;
[0066] 图3示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例 的流程示意图;
[0067] 图4示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例 的结构不意图;
[0068] 图5示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例 的系统架构示意图。

【具体实施方式】
[0069] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。应注 意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置不限制本发 明的范围。
[0070] 以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明 及其应用或使用的任何限制。基于本发明中的实施例,本领域普通技术人员在没有作出创 造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0071] 对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适 当情况下,所述技术、方法和设备应当被视为授权说明书的一部分。
[0072] 在这里示出和讨论的所有示例中,任何具体值应被解释为仅仅是示例性的,而不 是作为限制。因此,示例性实施例的其它示例可以具有不同的值。
[0073] 参见图1所示,图1示出本发明所提供的在Java应用中测量用户资源使用量的方 法一种实施例的流程示意图。该实施例提供的在Java应用中测量用户资源使用量的方法 包括以下操作流程。
[0074] 101,响应于接收到用户发起的Java应用访问请求,从应用访问请求中,识别用户 身份信息。
[0075] 102,在根据业务逻辑处理Java应用访问请求的过程中,调用Java应用访问请求 所需要的Java系统资源类单元,其中,Java系统资源类单元包含与Java系统资源类单元 相对应的资源测量代码单元。
[0076] 103,资源测量代码单元在Java系统资源类单元被调用的过程中,测量调用Java 系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对 应的计数信息中。计数信息可以是针对各种系统资源使用量的计数器中。
[0077] 本发明上述实施例提供的方法中,识别用户身份信息,调用Java应用访问请求所 需要的Java系统资源类单元,通过在Java系统资源类单元中包含与Java系统资源类单元 相对应的资源测量代码单元,从而能够在Java系统资源类单元被调用的过程中,利用资源 测量代码单元准确地测量用户实际所占用的系统资源使用量,并将系统资源使用量记录在 与用户身份信息相对应的计数信息中,从而有效提升了用户资源使用量的测量精度。
[0078] 对于多租户应用来说,用户可以属于某个租户。一个租户下拥护多个用户。例如, 租户可能为企业,用户则是企业下的员工,用户数可能比租户数要大1到2个数量级。此时, 在这种场景下,租户作为订购和支付包括资源费用和功能费用等应用费用的对象。
[0079] 因此,根据本发明装置实施例的一个具体示例,用户身份信息为用户所属的租户 标识;用户身份信息相对应的计数信息为租户标识所对应的计数信息。
[0080] 例如,用户身份信息可以是包含租户标识的用户标识。如用户标识al@coml、a2i coml,其中包含的租户标识为coml。在操作101识别用户身份信息的操作中,具体识别用户 所属的租户标识。在操作103中,用户身份信息相对应的计数信息可以是用户所属的租户 标识所对应的计数信息中,从而将资源的计数归属在租户标识上,实现对租户根据使用量 进行收费,而不必对单个用户进行收发。
[0081] 根据本发明方法一种具体实施例,在执行图1中101的操作之后,该方法还可以包 括:
[0082] 201,将用户身份信息写入与用户身份信息向对应的用户上下文信息中。资源测量 代码单元从用户上下文信息中获得用户身份信息,以将系统资源使用量记录在与用户身份 信息相对应的计数信息中。
[0083] 一个用户会话为一个用户开始访问应用平台到结束访问这段时间的与应用平台 之间的会话。会话结束可以是因为用户退出应用或会话超时。当用户访问应用平台时, 可以由应用平台为用户创建与该用户对应的用户上下文信息,例如,以会话上下文对象 (SessionContext)的方式创建。户上下文信息可以包括会话标识、会话开始时间、用户标识 等信息,通常采用线程静态结构体进行保存。
[0084] 通过设置用户会话上下文信息,以将Java应用访问请求转发给具体的应用业务 逻辑单元,进一步传递给资源测量代码单元,从而获得用户身份信息,以将系统资源使用量 记录在与用户身份信息相对应的计数信息中。
[0085] 可以通过多种方式将该用户上下文信息传给具体应用的应用业务逻辑单元,比如 将SessionContext通过函数参数传给处理该会话的应用业务逻辑单元,从而在该单元获 知当前在处理的是哪个用户的会话。
[0086] 根据本发明方法实施例的一个具体示例,在调用Java应用访问请求所需要的 Java系统资源类单元之前,该方法还包括:
[0087] 301,根据应用业务逻辑,分析获得Java应用访问请求所需要的Java系统资源类 单元;
[0088] 302,识别是否已经加载Java系统资源类单元;
[0089] 若已经加载Java系统资源类单元,执行调用Java应用访问请求所需要的Java系 统资源类单元的操作;否则,执行303将资源测量代码单元注入到对应的原始Java系统资 源类单元中,生成包含资源测量代码单元的Java系统资源类单元,304加载包含资源测量 代码单元的Java系统资源类单元。
[0090] 可以采用不同的方式来实现303操作中将资源测量代码单元注入到对应的原始 Java系统资源类单元中。
[0091] 例如,将资源测量代码单元加入到原始Java系统资源类单元的子类的定义中,生 成包含资源测量代码单元的Java系统资源类单元。
[0092] 新生成的包含资源测量代码单元的Java系统资源类单元可以为原始Java系统资 源类单元(即父类单元)的子类单元,从而在应用调用该父类单元时,返回包含资源测量代 码单元的子类单元,根据子类单元的定义,利用子类单元所包含的资源测量代码单元进行 系统资源测量。
[0093] 上述资源测量代码单元的注入过程,对上层应用来说是完全透明的,用户在进行 Java应用访问请求并获得应用服务的过程中,在用户对测量过程没有感知的情况下,完成 对系统资源占用量的测量。
[0094] 在具体实现中,可以利用多种Java的动态替换类或动态注入代码的方式将资源 测量代码单元注入到对应的原始Java系统资源类单元中,生成Java系统资源类单元,并加 载Java系统资源类单元。
[0095] 一种方式可以是修改原始Java系统资源类,生成该Java系统资源类的子类,作为 Java系统资源类。从而加载Java系统资源类的子类。例如通过Java的Thread类,仓ij建 Thread类的子类ThreadEX,再ThreadEx覆盖Thread的run方法,在子类的run方法中加 入资源测量代码。
[0096]另一种做法是使用 Java 的 Instrumentation 代理机制。Java Instrumentation 机制允许通过提供"Java代理〃来检查和修改加载的类字节代码。通过先做一个实现 ClassFileTransformer接口的资源转换类,将Thread类的class替换成ThreadEX类的 class,其中,ThreadEX不需要是Thread的子类,但需要提供和Thread类完全一样的方法, 再将资源转换类通过Instrumentation的addTransformer方法注册到系统类加载器中,系 统类加载器在加载资源类Thread时,就会调用转换器加载注入了监测代码的ThreadEX。
[0097] 根据具体的测量方式,可以采用不同的方法通过Java系统资源类测量用户所使 用的系统资源。示例性地,Java系统资源类单元包括可以线程调度器单元、对象(Object) 构造器单元、文件读写(10)器单元中的至少一种。相应地,资源测量代码单元测量的系统 资源使用量分别为CPU占用时间、内存占用大小、10数据量大小中的至少一种。
[0098] 可以为每个租户所消耗的每类系统资源设置一个计数信息,分别记录每个租户对 每类系统资源的累计使用量。
[0099] 以下分别示例性地展示其中三种系统资源的测量方法。
[0100] CPU占用时间的测量体现了对CPU资源的占用。例如,用户在一段时间内使用的 CPU时间(秒)或CPU时钟周期(次),在确定的服务器的CPU主频、CPU时间后可以通过换算 获得CPU时钟周期。通过API获取每条线程的CPU时间计数器,通过测量用户使用过的所 有线程的CPU时间计数器的变化量,从而得到用户消耗的CPU时间。
[0101] 内存占用大小体现了对内存资源的占用。例如,用户在一段时间内创建的内存对 象占用的总内存的大小(MB)。在Java中,内存对象可以是通过new操作创建的,在创建内 存对象之后,可通过API获取创建的内存对象大小。
[0102] 10数据量大小体现了对10资源的占用。例如,用户在一段时间内读取或写入的 总数据量(MB),通过10类的read和write方法进行10读写操作,通过记录每次read或 write的数据量即为用户消耗的10资源。以下更具体地展示对各种资源测量的部分实现方 式。
[0103] 根据本发明方法实施例的一个具体示例,Java系统资源类单元为线程调度器单 元,系统资源使用量为CPU占用时间。在具体实现中,线程调度器可以是由Java虚拟机 (JVM)控制。资源测量代码单元测量调用Java系统资源类单元占用的系统资源使用量,具 体可以通过在调用线程调度器单元加载线程子类运行时,测量运行线程子类所占用的CPU 时钟周期个数,作为CPU占用时间。
[0104] 对于通过线程调度器对CPU占用时间的测量方法可以有以下两种:方法1 :Thread 的子类ThreadEX,重载run方法
[0105] 在子类ThreadEX的run方法中增加以下资源测量代码单元:
[0106] long cputime=get_CPU_Time_Counter_of_Current_Thread();
[0107] //记录运行开始时间cputime
[0108] super, run ();
[0109] //父类开始运行
[0110] long cpucost=get_CPU_Time_Counter_of_Current_Thread()-cputime;
[0111] //运行结束时间减去运行开始时间,即为CPU耗时
[0112] record_cpu (rentid, cpucost);
[0113] //记录该用户标识rentid与其CPU耗时cpucost
[0114] 方法2 :定义Java系统线程调度器的子类,当根据业务逻辑,调用该子类执行时, 测量运行线程子类所占用的CPU时钟周期个数。CPU占用时间描述的是线程实际占用CPU 的时钟周期个数,可以为线程执行的CPU时间计数器之差,从而获得CPU占用时间。
[0115] 根据本发明方法实施例的一个具体示例,Java系统资源类单元为对象构造器单 元,系统资源使用量为内存(Memory)占用大小。
[0116] 测量调用Java系统资源类单元占用的系统资源使用量,具体可以包括:
[0117] 在调用对象构造器单元构造对象子类运行时,测量对象子类所占用的内存大小, 作为内存占用大小。
[0118] 具体实施例对Memory大小的测量方式,可以通过以下方法来实施。
[0119] 可考虑只对特定的实体类进行测量,为需测量的实体类定义测量子类,即对内存 消耗较大的子类定义包含测量代码单元的子类。
[0120] 例如,采用对象工厂ObjectFactory创建对象时,可定义对象工厂应用的子类 0bjectFactoryEX,在其 createObject 方法中实现:
[0121] Object obj=super. createObject ();
[0122] //创建子类
[0123] long objsize=get_0bject_size(obj);
[0124] //获取对象子类所占用的内存大小,作为内存占用大小
[0125] record_memory(rentid, objsize);
[0126] //记录用户标识rentid与对应的内存占用大小
[0127] return obj;
[0128] 根据本发明方法实施例的一个具体示例,Java系统资源类单元为文件读写器单 元,系统资源使用量为10数据量大小:
[0129] 测量调用Java系统资源类单元占用的系统资源使用量,具体包括:
[0130] 在调用文件读写器单元加载输入流子类运行时,测量输入流子类读取的数据量大 小,作为10数据量大小;或者
[0131] 在调用文件读写器单元加载输出流子类运行时,测量输出流子类写入的数据量大 小,作为10数据量大小。
[0132] 具体地,可以分别扩展各类InputStream类的read方法和OutputStream类的 write方法,分别测量输入流子类读取的数据量大小以及测量输出流子类写入的数据量大 小。
[0133] 上述实施例中,对于其他非核心系统资源类也可以由JavaEE容器自带的资源类, 使用上述方法进行测量。
[0134] 对于部分Java系统资源类来说,部分核心类是由启动类加载器(Bootstrap Loader)加载,例如Object、File、String,对这些类进行修改可以是直接替换系统类库中的 类文件,或者修改Java的启动类加载器。以下展示另一种实施方式。
[0135] 根据本发明方法实施例的一个具体示例,在调用Java应用访问请求所需要的 Java系统资源类单元之前,该方法还包括:
[0136] 利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,对象 单元包含资源测量代码单元;
[0137] 响应于Java应用访问请求,从测量系统资源类的对象单元中选择所需要的对象 单元;
[0138] 利用所选择的对象单元的定义创建Java应用访问请求所需要的Java系统资源类 单元。
[0139] 由于Java应用容器中提供对象工厂(0b jectFactory)或资源类工厂 (ResourceFactory),用于创建应用中所有的资源类对象。因此,可以利用对象工厂用于创 建任意的类,扩展对象工厂不仅可以创建内存测量子类单元,还可以创建线程测量子类单 元、10测量子类单元。
[0140] 在对象工厂中根据系统资源测量策略为需测量的系统资源类创建添加了资源测 量代码的测量系统资源类子类。
[0141] 对象工厂可以有两个创建对象的方法,分别用于创建带参数的对象和不带参数对 象:
[0142] Object createObject (String className) ;//用于不带参数的对象创建
[0143] Object createOb ject (String className, 0b ject [] args) ;//用于带参数的对象 创建。
[0144] 例如,创建线程可以调用:
[0145] Thread thread=create(〃java. lang. ThreacT)
[0146] 对象工厂在创建对象时先通过类名判断该资源类是否为需要测量的资源类,如果 是需测量的资源类则返回其添加了资源测量代码的子类。
[0147] 为了便于应用移植,可以在Java应用编译前先扫描Java代码中的所有new 关键字的语句:Thead thread=new Thread () ; Thread将其替换为对象工厂调用语句: thread=create (〃java. lang. Thread")。可以通过如下流程来实施:
[0148] 1预先扫描Java应用代码,将带new关键字的语句替换为使用对象工厂创建对象 的语句,编译并打包部署Java应用。
[0149] 2响应于接收到用户发起的Java应用访问请求,识别用户身份信息,在用户会话 上下文信息(或称为用户上下文信息)中保存用户身份信息,其中,用户会话上下文信息可 以通过会话线程变量或全局的哈希表保存;
[0150] 3根据业务逻辑,应用程序通过Java应用容器单元的对象工厂单元创建测量系统 资源类的对象单元,对象单元包含资源测量代码单元;其中,所创建的测量资源类的对应单 元的定义可保存在对象工厂的哈希表中,哈希key为类名;
[0151] 4对象工厂单元利用应用程序传入的类名搜索在步骤3中所创建的测量系统资源 类的对象单元的定义,如果存在对应的系统资源类定义,则选择所需要的对象单元,用该系 统资源类的定义创建一个系统资源类;对于不存在对于的系统资源类定义,则直接用Java 原有的类定义创建类;
[0152] 5当应用程序或系统执行利用所选择的对象单元的定义创建所需要的Java系统 资源类单元,触发资源测量代码单元测量对于的系统资源使用量。
[0153] 参见图4所示,图4示出本发明所提供的在Java应用中测量用户资源使用量的装 置一种实施例的结构示意图。该实施例提供的在Java应用中测量用户资源使用量的装置 包括:
[0154] 应用服务入口单元401,用于响应于接收到用户发起的Java应用访问请求,从应 用访问请求中,识别用户身份信息;
[0155] 应用业务逻辑单元402,用于根据业务逻辑处理Java应用访问请求,在根据业务 逻辑处理Java应用访问请求的过程中,调用Java应用访问请求所需要的Java系统资源 类单元,其中,Java系统资源类单元包含与Java系统资源类单元相对应的资源测量代码单 元;
[0156] 资源测量代码单元403,用于在Java系统资源类单元被调用的过程中,测量调用 Java系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息 相对应的计数信息中。
[0157] 根据本发明装置实施例的一个具体示例,用户身份信息为用户所属的租户标识; 用户身份信息相对应的计数信息为租户标识所对应的计数信息。
[0158] 根据本发明装置实施例的一个具体示例,应用业务逻辑单元,还用于在调用Java 应用访问请求所需要的Java系统资源类单元之前,根据应用业务逻辑,分析获得Java应用 访问请求所需要的Java系统资源类单元;识别是否已经加载Java系统资源类单元;响应 于已经加载Java系统资源类单元,调用Java应用访问请求所需要的Java系统资源类单元 的操作;
[0159] 资源类转换器单元404,用于响应于未加载Java系统资源类单元,将资源测量代 码单元注入到对应的原始Java系统资源类单元中,生成Java系统资源类单元;
[0160] 类加载器单元405,用于加载生成的Java系统资源类单元。
[0161] 在具体的实现中,Java类,包括资源类或其他类,其加载可以是由new关键字触发 的。类加载器单元405在加载系统资源类定义时,自动加载添加了资源测量代码单元的上 述Java系统资源类单元并替换原有的类单元定义。自定义的类加载器单元405可以通过 JVM传入的类名判断是否需要加载自定义的资源类。
[0162] 根据本发明装置实施例的一个具体示例,Java系统资源类单元包括线程调度器单 元、对象构造器单元、文件读写器单元中的至少一种;相应地,资源测量代码单元测量的系 统资源使用量分别为CPU占用时间、内存占用大小、10数据量大小中的至少一种。
[0163] 根据本发明装置实施例的一个具体示例,Java系统资源类单元为线程调度器单 元,系统资源使用量为CPU占用时间;
[0164] 资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时,测量 运行线程子类所占用的CPU时钟周期个数。
[0165] 根据本发明装置实施例的一个具体示例,Java系统资源类单元为对象构造器单 元,系统资源使用量为内存占用大小;
[0166] 资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时,测量 构造对象子类所占用的内存大小,作为内存占用大小。
[0167] 根据本发明装置实施例的一个具体示例,Java系统资源类单元为文件读写器单 元,系统资源使用量为10数据量大小:
[0168] 资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行时,测 量输入流子类读取的数据量大小,作为10数据量大小;或者
[0169] 在调用文件读写器单元加载输出流子类运行时,测量输出流子类写入的数据量大 小,作为10数据量大小。
[0170] 根据本发明装置实施例的一个具体示例,该装置还包括:
[0171] Java应用容器单元,用于在调用Java应用访问请求所需要的Java系统资源类单 元之前,利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,对象单 元包含资源测量代码单元;
[0172] 应用业务逻辑单元,还用于响应于Java应用访问请求,从测量系统资源类的对象 单元中选择所需要的对象单元;利用所选择的对象单元的定义创建Java应用访问请求所 需要的Java系统资源类单元。
[0173] 根据本发明装置实施例的一个具体示例,该装置还包括:
[0174] 上下文信息管理单元406,用于将用户身份信息写入与用户身份信息向对应的用 户上下文信息中;
[0175] 资源测量代码单元403从用户上下文信息中获得用户身份信息,以将系统资源使 用量记录在与用户身份信息相对应的计数信息中。
[0176] 参见图5所示,图5示出本发明所提供的在Java应用中测量用户资源使用量的装 置一种实施例的系统架构示意图。图5所示的实施例可以通过Java虚拟机(JVM)来实现, 通过代码注入机制为各个Java系统资源类动态注入用户资源测量代码,当Java应用程序 调用了注入了测量代码的Java资源类时,测量代码将自动记录用户对当前资源的实际使 用量。
[0177] 资源测量代码注入的过程:
[0178] JVM类加载器通过资源类转换器单元将资源测量代码注入到各种Java系统资源 类中(1. 1-1. 2),如线程调度器单元、对象构造器单元、文件读写器单元等等,然后类加载器 单元在应用运行时动态加载注入了资源测量代码的资源类字节码(1. 3)。
[0179] 用户使用的系统资源的测量过程:
[0180] 示例性地,用户B向应用发起应用访问请求(2. 1),应用服务入口单元接收到用户 的应用访问请求,识别用户身份信息,将用户B的身份标识、会话标识、会话开始时间等信 息写入用户上下文信息对应的存储模块,可以是与用户绑定的线程静态结构体中(2. 2)。然 后调用应用业务逻辑单元处理用户的应用访问请求(2. 3),应用业务逻辑单元在执行时会 调用各种Java系统资源类进行相应的系统资源操作(2. 4),如执行线程、创建对象、读写文 件等,从而触发注入到系统资源类单元中的资源测量代码,资源测量代码单元获取用户身 份信息(2. 5),测量出用户B对相应系统资源的实际使用量,然后将资源使用量更新到用户 B的对应资源计数信息中(2. 6),计数信息可以是针对各种资源的计数器。
[0181] 至此,已经详细描述了根据本发明的一种在多用户Java应用中测量用户资源使 用量的方法与装置。为了避免遮蔽本发明的构思,没有描述本领域所公知的一些细节。本 领域技术人员根据上面的描述,完全可以明白如何实施这里公开的技术方案。
[0182] 本说明书中各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其 它实施例的不同之处,各个实施例之间相同或相似的部分相互参见即可。对于在多用户 Java应用中测量用户资源使用量的装置实施例而言,由于其与方法实施例基本对应,所以 描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0183] 可能以许多方式来实现本发明的在多用户Java应用中测量用户资源使用量的方 法与装置。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本发明的 在多用户Java应用中测量用户资源使用量的方法与装置。用于所述方法的步骤的上述顺 序仅是为了进行说明,本发明的方法的步骤不限于以上具体描述的顺序,除非以其它方式 特别说明。此外,在一些实施例中,还可将本发明实施为记录在记录介质中的程序,这些程 序包括用于实现根据本发明的方法的机器可读指令。因而,本发明还覆盖存储用于执行根 据本发明的方法的程序的记录介质。
[0184] 虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技 术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技 术人员应该理解,可在不脱离本发明的范围和精神的情况下,对以上实施例进行修改。本发 明的范围由所附权利要求来限定。
【权利要求】
1. 一种在Java应用中测量用户资源使用量的方法,其特征在于,所述方法包括: 响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述用户 身份信息; 在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求 所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类 单元相对应的资源测量代码单元; 所述资源测量代码单元在所述Java系统资源类单元被调用的过程中,测量调用所述 Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户 身份信息相对应的计数信息中。
2.根据权利要求1所述的方法,其特征在于,在调用所述Java应用访问请求所需要的 Java系统资源类单元之前,所述方法还包括: 根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类单 元; 识别是否已经加载所述Java系统资源类单元; 若已经加载所述Java系统资源类单元,执行所述调用所述Java应用访问请求所需要 的Java系统资源类单元的操作;否则,将所述资源测量代码单元注入到对应的原始Java系 统资源类单元中,生成所述Java系统资源类单元,并加载生成的所述Java系统资源类单 元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作。
3.根据权利要求2所述的方法,其特征在于,所述Java系统资源类单元包括线程调度 器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单元 测量的系统资源使用量分别为CPU占用时间、内存占用大小、10数据量大小中的至少一种。
4.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为线程调度器 单元,所述系统资源使用量为CPU占用时间; 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括: 在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的CPU时 钟周期个数,作为所述CPU占用时间。
5.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为对象构造器 单元,所述系统资源使用量为内存占用大小; 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括: 在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大小, 作为所述内存占用大小。
6.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为文件读写器 单元,所述系统资源使用量为10数据量大小: 所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括: 在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据量大 小,作为所述10数据量大小;或者 在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大 小,作为所述10数据量大小。
7.根据权利要求1所述的方法,其特征在于,在调用所述Java应用访问请求所需要的 Java系统资源类单元之前,所述方法还包括: 利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,所述对象 单元包含所述资源测量代码单元; 响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需要的 对象单元; 利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资源类 单元。
8.根据权利要求1至7任意一项所述的方法,其特征在于,所述方法还包括: 将所述用户身份信息写入与所述用户身份信息相对应的用户上下文信息中; 所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系 统资源使用量记录在与所述用户身份信息相对应的计数信息中。
9.根据权利要求1所述的方法,其特征在于,所述用户身份信息,为所述用户所属的租 户标识; 所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
10. 一种在Java应用中测量用户资源使用量的装置,其特征在于,所述装置包括: 应用服务入口单元,用于响应于接收到用户发起的Java应用访问请求,从所述应用访 问请求中,识别所述用户身份信息; 应用业务逻辑单元,用于根据业务逻辑处理所述Java应用访问请求,在根据业务逻辑 处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系统资 源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源测量 代码单元; 资源测量代码单元,用于在所述Java系统资源类单元被调用的过程中,测量调用所述 Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户 身份信息相对应的计数信息中。
11.根据权利要求10所述的装置,其特征在于,所述应用业务逻辑单元,还用于在调用 所述Java应用访问请求所需要的Java系统资源类单元之前,根据应用业务逻辑,分析获得 所述Java应用访问请求所需要的Java系统资源类单元;识别是否已经加载所述Java系统 资源类单元;响应于已经加载所述Java系统资源类单元,调用所述Java应用访问请求所需 要的Java系统资源类单元的操作; 资源类转换器单元,用于响应于未加载所述Java系统资源类单元,将所述资源测量代 码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元; 类加载器单元,用于加载生成的所述Java系统资源类单元。
12.根据权利要求11所述的装置,其特征在于,所述Java系统资源类单元包括线程调 度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单 元测量的系统资源使用量分别为CPU占用时间、内存占用大小、10数据量大小中的至少一 种。
13.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为线程调度 器单元,所述系统资源使用量为CPU占用时间; 所述资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时,测量 运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
14.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为对象构造 器单元,所述系统资源使用量为内存占用大小; 所述资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时,测量 所述对象子类所占用的内存大小,作为所述内存占用大小。
15.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为文件读写 器单元,所述系统资源使用量为10数据量大小: 所述资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行时,测 量所述输入流子类读取的数据量大小,作为所述10数据量大小;或者在调用文件读写器单 元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述10数据量大 小。
16.根据权利要求10所述的装置,其特征在于,所述装置还包括: Java应用容器单元,用于在调用所述Java应用访问请求所需要的Java系统资源类单 元之前,利用对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述资源 测量代码单元; 所述应用业务逻辑单元,还用于响应于所述Java应用访问请求,从所述测量系统资源 类的对象单元中选择所需要的对象单元;利用所选择的对象单元的定义创建所述Java应 用访问请求所需要的Java系统资源类单元。
17.根据权利要求10至16任意一项所述的装置,其特征在于,所述装置还包括: 上下文信息管理单元,用于将所述用户身份信息写入与所述用户身份信息向对应的用 户上下文信息中; 所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系 统资源使用量记录在与所述用户身份信息相对应的计数信息中。
18.根据权利要求10所述的装置,其特征在于,所述用户身份信息为所述用户所属的 租户标识; 所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
【文档编号】H04L12/58GK104142817SQ201310170698
【公开日】2014年11月12日 申请日期:2013年5月10日 优先权日:2013年5月10日
【发明者】何震苇, 杨新章, 陆钢, 区洪辉, 陈力, 李慧云, 梁柏青, 陈珣 申请人:中国电信股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1