CN116755788A - 一种线上规则修改方法、装置、设备及存储介质 - Google Patents

一种线上规则修改方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN116755788A
CN116755788A CN202310393113.1A CN202310393113A CN116755788A CN 116755788 A CN116755788 A CN 116755788A CN 202310393113 A CN202310393113 A CN 202310393113A CN 116755788 A CN116755788 A CN 116755788A
Authority
CN
China
Prior art keywords
jar file
file package
rule
java
memory
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310393113.1A
Other languages
English (en)
Inventor
郭云飞
陈亮宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Shuhan Technology Co ltd
Original Assignee
Hangzhou Shuhan Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hangzhou Shuhan Technology Co ltd filed Critical Hangzhou Shuhan Technology Co ltd
Priority to CN202310393113.1A priority Critical patent/CN116755788A/zh
Publication of CN116755788A publication Critical patent/CN116755788A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种线上规则修改方法、装置、设备及存储介质,涉及数据处理技术领域。该方法包括:获取待修改规则,并确定与所述待修改规则对应的JAR文件包;将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。通过本申请的技术方案,从将待修改规则对应的JAR文件包作为外部插件的形式的角度出发,利用预设类加载器间外部插件加载至内存,然后通过JAVA反射机制进行动态编译。如此一来,整个过程无需对主程序代码进行修改,可以实现动态可插拔和不停机运维,能够在不影响实际生产应用的同时满足客户的需求。

Description

一种线上规则修改方法、装置、设备及存储介质
技术领域
本发明涉及数据处理技术领域,特别涉及一种线上规则修改方法、装置、设备及存储介质。
背景技术
在规则需求较多的场景下,经常会发现存在规则调整的问题、或存在用户想及时获取到最新规则结果的需求,而不停机运维的问题不解决会带来影响生产的问题。为解决停机运维修改规则问题,现有技术从动态角度出发,提出一种利用动态配置技术的解决方案,该解决方案具体为:通过web操作提供可配置化的规则工具。虽然通过使用配置的方式解决了规则可调整的问题,然而该方案在实际配置过程中,由于规则的多样和复杂性,导致实际操作的不可达。例如因采用了配置化的规则,导致了跟着业务场景的模型无法配置,仍需要通过逻辑代码解决。
因此,如何提供一种解决上述技术问题的方案是本领域技术人员目前需要解决的问题。
发明内容
有鉴于此,本发明的目的在于提供一种线上规则修改方法、装置、设备及存储介质,能够解决现有技术因在实现技术规则不断变更时,应用需要重启的技术缺陷所带来的生产环境技术问题。其具体方案如下:
第一方面,本申请公开了一种线上规则修改方法,包括:
获取待修改规则,并确定与所述待修改规则对应的JAR文件包;
将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;
通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
可选的,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存,包括:
将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
可选的,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存的过程中,还包括:
获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;
生成用于存放所述预设JAVA文件的项目资源目录。
可选的,所述将所述JAR文件包作为外部插件,包括:
通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。
可选的,所述通过Java代理模式将所述JAR文件包作为外部插件,以实现插件化,包括:
通过Java代理模式,为所述JAR文件包对应的对象创建代理类;
将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。
可选的,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,还包括:
基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。
可选的,所述通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改,包括:
获取预设主程序调用接口;
基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。
第二方面,本申请公开了一种线上规则修改装置,包括:
待修改规则获取模块,用于获取待修改规则,并确定与所述待修改规则对应的JAR文件包;
加载模块,用于将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;
JAVA反射模块,用于通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
第三方面,本申请公开了一种电子设备,所述电子设备包括处理器和存储器;其中,所述存储器用于存储计算机程序,所述计算机程序由所述处理器加载并执行以实现如前所述的线上规则修改方法。
第四方面,本申请公开了一种计算机可读存储介质,用于存储计算机程序;其中所述计算机程序被处理器执行时实现如前所述的线上规则修改方法。
本申请提供了一种线上规则修改方法,包括:获取待修改规则,并确定与所述待修改规则对应的JAR文件包;将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。可见,本申请从将待修改规则对应的JAR文件包作为外部插件的形式的角度出发,利用预设类加载器间外部插件加载至内存,然后通过JAVA反射机制进行动态编译。如此一来,当对规则进行修改时,插件将对应输入的源码字符串注入内存,主程序从内存中读到对应输出的字节码数组,整个过程无需对主程序代码进行修改,可以实现动态可插拔和不停机运维,能够在不影响实际生产应用的同时满足客户的需求。
此外,本申请提供的一种线上规则修改装置、设备及存储介质,与上述线上规则修改方法对应,效果同上。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请公开的一种线上规则修改方法流程图;
图2为本申请公开的一种Spring中Bean的实例化节点程序示意图;
图3为本申请公开的一种Spring初始化完成前监听器注册程序示意图;
图4为本申请公开的一种线上规则修改装置结构示意图;
图5为本申请公开的一种电子设备结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
当前,在规则需求较多的场景下经常会发现存在规则调整的问题、或存在用户想及时获取到最新规则结果的需求,而不停机运维的问题不解决会带来影响生产的问题,无法预知将会导致什么样的后果,因此迫切的需要解决。
为此,本申请提供了一种线上规则修改方案,能够解决现有技术因在实现技术规则不断变更时,应用需要重启的技术缺陷所带来的生产环境技术问题。
本发明实施例公开了一种线上规则修改方法,参见图1所示,该方法包括:
步骤S11:获取待修改规则,并确定与所述待修改规则对应的JAR文件包。
在项目研发的过程中,关于项目中预警规则的配置存在较多的不确定性,由于无法确定的规则,使预警相关的开发止步不前。经过多方研究发现,从web配置的方向到自定义规则jar包的这个转变过程中,自定义规则的转变是比较可行的方案。本申请实施例中,为了实现动态可插拔、不停机运维,首先获取待修改规则,通过开发可执行的JAVA文件打好对应的JAR文件包,因此,进一步的确定与所述待修改规则对应的JAR文件包。其中,JAR文件包可以使用自定义MyBatis数据格式封装,能够在不影响实际应用成产的同时,还能满足客户的需求。
步骤S12:将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存。
本申请实施例中,要想实现加载外部JAR文件包来实现热部署,那么必然要把其中的class文件加载到内存中。具体的,将JAR文件包作为外部插件,应用Java代理模式实现JAR文件包的插件化。可以理解的是,类加载器(ClassLoader)包括DexClassLoader和PathClassLoader,由于DexClassLoader可以加载外部的JAR文件包,因此,将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
本申请实施例中,通过代理的方式,让主程序发现对应的资源id。也即,通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。具体的,通过Java代理模式,为所述JAR文件包对应的对象创建代理类;将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。可以理解的是,虽然加载进来了外部插件,但也仅仅是作为一个对象而存在,并没有在spring中注册,没有生命周期的回调,并不能实现想要的效果,因此,通过Java代理模式实现插件化。程序生成对应的代理类后,在代理类中添加了对应资源的id,主程序通过访问与插件对应的JAVA文件中的资源id,获取可执行的文件。
需要指出的是,res为存放项目资源的资源目录,res里的每一个资源都会在JAVA文件(R.java)里生成一个对应的Integer类型的id(Identity,身份标识号)。APP(Application,应用程序)启动时会先把JAVA文件注册到当前的上下文环境。由于本申请实施例中,将JAR文件包作为外部插件,那么主程序与插件相当于两个独立的程序,都存在各自的JAVA文件用来加载资源。由于在代码里以R.java文件的方式使用资源时是通过使用这些id访问res资源,然而插件的JAVA文件并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用。因此,需要重新生成一个新的项目资源目录用来保存插件的id。具体的,获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;生成用于存放所述预设JAVA文件的项目资源目录。另外,在重新生成一个新的Resource对象用于存放对应插件的项目资源目录后,查看源码,避免和主程序中的资源id冲突。
步骤S13:通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
本申请实施例中,将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,还包括:基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。如图2所示为Spring中Bean实例化节点的程序示意图,主要通过prepareContext方法进行Bean实例化,其中还包含了Spring的容器上下文,以及监听器的实现。
如图3所示为Spring初始化完成前监听器注册程序示意图,这里用户可以注册监听器(listener),在spring初始化完成之前,用户可以自定义写入自己的逻辑,比如在主程序完成实例化之前创建插件的监听。那么理论上就可以创建插件自己的监听器监听插件所创建的spring容器上下文。
本申请实施例中,因为插件与宿主不在一个容器内,那么一些类的访问必然要通过反射进行获取。因此,主程序与插件的通信使用反射的方式,通过主程序的接口调用插件中的实现类。具体的,获取预设主程序调用接口;基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。如此一来,实现在配置后动态调用JAR文件包的逻辑。另外,在应用Java反射机制时,其中涉及到的切面、动态编译以及j2cache多重缓冲等均为现有可实现的方式,在此不再进行赘述。
可以理解的是,在进行线上规则修改时,一种情况是拿不到它的源代码;另一种情况是即使有源代码也不想修改。因此,本申请实施例中通过ICI(Injection CoreInjection,动态注入工具)原理,在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代码逻辑,让注入的代码与第三方程序代码保持相对独立,进行动态编译时,由于字节码文件是跟随主程序的,而动态插入的文件字节码是跟随插件的,以插件方式将对应源码注入到内存中时,直接输入源码字符串并且输出的是字节码数组,而不是输出字节码文件,主程序是从内存中得到源码,再输出到内存的方式。
本申请提供了一种线上规则修改方法,包括:获取待修改规则,并确定与所述待修改规则对应的JAR文件包;将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。可见,本申请从将待修改规则对应的JAR文件包作为外部插件的形式的角度出发,利用预设类加载器间外部插件加载至内存,然后通过JAVA反射机制进行动态编译。如此一来,当对规则进行修改时,插件将对应输入的源码字符串注入内存,主程序从内存中读到对应输出的字节码数组,整个过程无需对主程序代码进行修改,可以实现动态可插拔和不停机运维,能够在不影响实际生产应用的同时满足客户的需求。
相应的,本申请实施例还公开了一种线上规则修改装置,参见图4所示,该装置包括:
待修改规则获取模块11,用于获取待修改规则,并确定与所述待修改规则对应的JAR文件包。
在项目研发的过程中,关于项目中预警规则的配置存在较多的不确定性,由于无法确定的规则,使预警相关的开发止步不前。经过多方研究发现,从web配置的方向到自定义规则jar包的这个转变过程中,自定义规则的转变是比较可行的方案。本申请实施例中,为了实现动态可插拔、不停机运维,首先获取待修改规则,通过开发可执行的JAVA文件打好对应的JAR文件包,因此,进一步的确定与所述待修改规则对应的JAR文件包。其中,JAR文件包可以使用自定义MyBatis数据格式封装,能够在不影响实际应用成产的同时,还能满足客户的需求。
加载模块12,用于将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存。
本申请实施例中,要想实现加载外部JAR文件包来实现热部署,那么必然要把其中的class文件加载到内存中。具体的,将JAR文件包作为外部插件,应用Java代理模式实现JAR文件包的插件化。可以理解的是,类加载器(ClassLoader)包括DexClassLoader和PathClassLoader,由于DexClassLoader可以加载外部的JAR文件包,因此,将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
在一些具体的实施方式中,所述加载模块12,包括:
代理类创建单元,用于通过Java代理模式,为所述JAR文件包对应的对象创建代理类;
获取可执行文件单元,用于将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。
本申请实施例中,通过代理的方式,让主程序发现对应的资源id。也即,通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。可以理解的是,虽然加载进来了外部插件,但也仅仅是作为一个对象而存在,并没有在spring中注册,没有生命周期的回调,并不能实现想要的效果,因此,通过Java代理模式实现插件化。程序生成对应的代理类后,在代理类中添加了对应资源的id,主程序通过访问与插件对应的JAVA文件中的资源id,获取可执行的文件。
在一些具体的实施方式中,所述加载模块12,包括:
资源标识号获取单元,用于获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;
项目资源目录生成单元,用于生成用于存放所述预设JAVA文件的项目资源目录。
需要指出的是,res为存放项目资源的资源目录,res里的每一个资源都会在JAVA文件(R.java)里生成一个对应的Integer类型的id(Identity,身份标识号)。APP(Application,应用程序)启动时会先把JAVA文件注册到当前的上下文环境。由于本申请实施例中,将JAR文件包作为外部插件,那么主程序与插件相当于两个独立的程序,都存在各自的JAVA文件用来加载资源。由于在代码里以R.java文件的方式使用资源时是通过使用这些id访问res资源,然而插件的JAVA文件并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用。因此,需要重新生成一个新的项目资源目录用来保存插件的id。另外,在重新生成一个新的Resource对象用于存放对应插件的项目资源目录后,查看源码,避免和主程序中的资源id冲突。
JAVA反射模块13,用于通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
在一种具体的实施方式中,所述线上规则修改装置,还包括:
实例化单元,用于将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。
如图2所示为Spring中Bean实例化节点的程序示意图,主要通过prepareContext方法进行Bean实例化,其中还包含了Spring的容器上下文,以及监听器的实现。
如图3所示为Spring初始化完成前监听器注册程序示意图,这里用户可以注册监听器(listener),在spring初始化完成之前,用户可以自定义写入自己的逻辑,比如在主程序完成实例化之前创建插件的监听。那么理论上就可以创建插件自己的监听器监听插件所创建的spring容器上下文。
在一种具体的实施方式中,所述JAVA反射模块13,包括:
接口获取单元,用于获取预设主程序调用接口;
实现类调用单元,用于基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。
本申请实施例中,因为插件与宿主不在一个容器内,那么一些类的访问必然要通过反射进行获取。因此,主程序与插件的通信使用反射的方式,通过主程序的接口调用插件中的实现类。如此一来,实现在配置后动态调用JAR文件包的逻辑。另外,在应用Java反射机制时,其中涉及到的切面、动态编译以及j2cache多重缓冲等均为现有可实现的方式,在此不再进行赘述。
可以理解的是,在进行线上规则修改时,一种情况是拿不到它的源代码;另一种情况是即使有源代码也不想修改。因此,本申请实施例中通过ICI(Injection CoreInjection,动态注入工具)原理,在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代码逻辑,让注入的代码与第三方程序代码保持相对独立,进行动态编译时,由于字节码文件是跟随主程序的,而动态插入的文件字节码是跟随插件的,以插件方式将对应源码注入到内存中时,直接输入源码字符串并且输出的是字节码数组,而不是输出字节码文件,主程序是从内存中得到源码,再输出到内存的方式。
由此可见,通过本实施例的上述方案,包括:获取待修改规则,并确定与所述待修改规则对应的JAR文件包;将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。可见,本申请从将待修改规则对应的JAR文件包作为外部插件的形式的角度出发,利用预设类加载器间外部插件加载至内存,然后通过JAVA反射机制进行动态编译。如此一来,当对规则进行修改时,插件将对应输入的源码字符串注入内存,主程序从内存中读到对应输出的字节码数组,整个过程无需对主程序代码进行修改,可以实现动态可插拔和不停机运维,能够在不影响实际生产应用的同时满足客户的需求。
进一步的,本申请实施例还公开了一种电子设备,图5是根据一示例性实施例示出的电子设备20结构图,图中内容不能认为是对本申请的使用范围的任何限制。
图5为本申请实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述公开的线上规则修改方法中的相关步骤如下:
步骤S11:获取待修改规则,并确定与所述待修改规则对应的JAR文件包。
在项目研发的过程中,关于项目中预警规则的配置存在较多的不确定性,由于无法确定的规则,使预警相关的开发止步不前。经过多方研究发现,从web配置的方向到自定义规则jar包的这个转变过程中,自定义规则的转变是比较可行的方案。本申请实施例中,为了实现动态可插拔、不停机运维,首先获取待修改规则,通过开发可执行的JAVA文件打好对应的JAR文件包,因此,进一步的确定与所述待修改规则对应的JAR文件包。其中,JAR文件包可以使用自定义MyBatis数据格式封装,能够在不影响实际应用成产的同时,还能满足客户的需求。
步骤S12:将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存。
本申请实施例中,要想实现加载外部JAR文件包来实现热部署,那么必然要把其中的class文件加载到内存中。具体的,将JAR文件包作为外部插件,应用Java代理模式实现JAR文件包的插件化。可以理解的是,类加载器(ClassLoader)包括DexClassLoader和PathClassLoader,由于DexClassLoader可以加载外部的JAR文件包,因此,将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
本申请实施例中,通过代理的方式,让主程序发现对应的资源id。也即,通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。具体的,通过Java代理模式,为所述JAR文件包对应的对象创建代理类;将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。可以理解的是,虽然加载进来了外部插件,但也仅仅是作为一个对象而存在,并没有在spring中注册,没有生命周期的回调,并不能实现想要的效果,因此,通过Java代理模式实现插件化。程序生成对应的代理类后,在代理类中添加了对应资源的id,主程序通过访问与插件对应的JAVA文件中的资源id,获取可执行的文件。
需要指出的是,res为存放项目资源的资源目录,res里的每一个资源都会在JAVA文件(R.java)里生成一个对应的Integer类型的id(Identity,身份标识号)。APP(Application,应用程序)启动时会先把JAVA文件注册到当前的上下文环境。由于本申请实施例中,将JAR文件包作为外部插件,那么主程序与插件相当于两个独立的程序,都存在各自的JAVA文件用来加载资源。由于在代码里以R.java文件的方式使用资源时是通过使用这些id访问res资源,然而插件的JAVA文件并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用。因此,需要重新生成一个新的项目资源目录用来保存插件的id。具体的,获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;生成用于存放所述预设JAVA文件的项目资源目录。另外,在重新生成一个新的Resource对象用于存放对应插件的项目资源目录后,查看源码,避免和主程序中的资源id冲突。
步骤S13:通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
本申请实施例中,将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,还包括:基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。如图2所示为Spring中Bean实例化节点的程序示意图,主要通过prepareContext方法进行Bean实例化,其中还包含了Spring的容器上下文,以及监听器的实现。
如图3所示为Spring初始化完成前监听器注册程序示意图,这里用户可以注册监听器(listener),在spring初始化完成之前,用户可以自定义写入自己的逻辑,比如在主程序完成实例化之前创建插件的监听。那么理论上就可以创建插件自己的监听器监听插件所创建的spring容器上下文。
本申请实施例中,因为插件与宿主不在一个容器内,那么一些类的访问必然要通过反射进行获取。因此,主程序与插件的通信使用反射的方式,通过主程序的接口调用插件中的实现类。具体的,获取预设主程序调用接口;基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。如此一来,实现在配置后动态调用JAR文件包的逻辑。另外,在应用Java反射机制时,其中涉及到的切面、动态编译以及j2cache多重缓冲等均为现有可实现的方式,在此不再进行赘述。
可以理解的是,在进行线上规则修改时,一种情况是拿不到它的源代码;另一种情况是即使有源代码也不想修改。因此,本申请实施例中通过ICI(Injection CoreInjection,动态注入工具)原理,在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代码逻辑,让注入的代码与第三方程序代码保持相对独立,进行动态编译时,由于字节码文件是跟随主程序的,而动态插入的文件字节码是跟随插件的,以插件方式将对应源码注入到内存中时,直接输入源码字符串并且输出的是字节码数组,而不是输出字节码文件,主程序是从内存中得到源码,再输出到内存的方式。
另外,本实施例中的电子设备20具体可以为计算机。
本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口24能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作系统221、计算机程序222及数据223等,数据223可以包括各种各样的数据。存储方式可以是短暂存储或者永久存储。
其中,操作系统221用于管理与控制电子设备20上的各硬件设备以及计算机程序222,其可以是Windows Server、Netware、Unix、Linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的线上规则修改方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。
进一步的,本申请实施例还公开了一种计算机可读存储介质,这里所说的计算机可读存储介质包括随机存取存储器(Random Access Memory,RAM)、内存、只读存储器(Read-Only Memory,ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、磁碟或者光盘或技术领域内所公知的任意其他形式的存储介质。其中,所述计算机程序被处理器执行时实现前述线上规则修改方法中的相关步骤如下:
步骤S11:获取待修改规则,并确定与所述待修改规则对应的JAR文件包。
在项目研发的过程中,关于项目中预警规则的配置存在较多的不确定性,由于无法确定的规则,使预警相关的开发止步不前。经过多方研究发现,从web配置的方向到自定义规则jar包的这个转变过程中,自定义规则的转变是比较可行的方案。本申请实施例中,为了实现动态可插拔、不停机运维,首先获取待修改规则,通过开发可执行的JAVA文件打好对应的JAR文件包,因此,进一步的确定与所述待修改规则对应的JAR文件包。其中,JAR文件包可以使用自定义MyBatis数据格式封装,能够在不影响实际应用成产的同时,还能满足客户的需求。
步骤S12:将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存。
本申请实施例中,要想实现加载外部JAR文件包来实现热部署,那么必然要把其中的class文件加载到内存中。具体的,将JAR文件包作为外部插件,应用Java代理模式实现JAR文件包的插件化。可以理解的是,类加载器(ClassLoader)包括DexClassLoader和PathClassLoader,由于DexClassLoader可以加载外部的JAR文件包,因此,将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
本申请实施例中,通过代理的方式,让主程序发现对应的资源id。也即,通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。具体的,通过Java代理模式,为所述JAR文件包对应的对象创建代理类;将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。可以理解的是,虽然加载进来了外部插件,但也仅仅是作为一个对象而存在,并没有在spring中注册,没有生命周期的回调,并不能实现想要的效果,因此,通过Java代理模式实现插件化。程序生成对应的代理类后,在代理类中添加了对应资源的id,主程序通过访问与插件对应的JAVA文件中的资源id,获取可执行的文件。
需要指出的是,res为存放项目资源的资源目录,res里的每一个资源都会在JAVA文件(R.java)里生成一个对应的Integer类型的id(Identity,身份标识号)。APP(Application,应用程序)启动时会先把JAVA文件注册到当前的上下文环境。由于本申请实施例中,将JAR文件包作为外部插件,那么主程序与插件相当于两个独立的程序,都存在各自的JAVA文件用来加载资源。由于在代码里以R.java文件的方式使用资源时是通过使用这些id访问res资源,然而插件的JAVA文件并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用。因此,需要重新生成一个新的项目资源目录用来保存插件的id。具体的,获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;生成用于存放所述预设JAVA文件的项目资源目录。另外,在重新生成一个新的Resource对象用于存放对应插件的项目资源目录后,查看源码,避免和主程序中的资源id冲突。
步骤S13:通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
本申请实施例中,将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,还包括:基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。如图2所示为Spring中Bean实例化节点的程序示意图,主要通过prepareContext方法进行Bean实例化,其中还包含了Spring的容器上下文,以及监听器的实现。
如图3所示为Spring初始化完成前监听器注册程序示意图,这里用户可以注册监听器(listener),在spring初始化完成之前,用户可以自定义写入自己的逻辑,比如在主程序完成实例化之前创建插件的监听。那么理论上就可以创建插件自己的监听器监听插件所创建的spring容器上下文。
本申请实施例中,因为插件与宿主不在一个容器内,那么一些类的访问必然要通过反射进行获取。因此,主程序与插件的通信使用反射的方式,通过主程序的接口调用插件中的实现类。具体的,获取预设主程序调用接口;基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。如此一来,实现在配置后动态调用JAR文件包的逻辑。另外,在应用Java反射机制时,其中涉及到的切面、动态编译以及j2cache多重缓冲等均为现有可实现的方式,在此不再进行赘述。
可以理解的是,在进行线上规则修改时,一种情况是拿不到它的源代码;另一种情况是即使有源代码也不想修改。因此,本申请实施例中通过ICI(Injection CoreInjection,动态注入工具)原理,在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代码逻辑,让注入的代码与第三方程序代码保持相对独立,进行动态编译时,由于字节码文件是跟随主程序的,而动态插入的文件字节码是跟随插件的,以插件方式将对应源码注入到内存中时,直接输入源码字符串并且输出的是字节码数组,而不是输出字节码文件,主程序是从内存中得到源码,再输出到内存的方式。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的线上规则修改或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种线上规则修改方法、装置、设备及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种线上规则修改方法,其特征在于,包括:
获取待修改规则,并确定与所述待修改规则对应的JAR文件包;
将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;
通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
2.根据权利要求1所述的线上规则修改方法,其特征在于,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存,包括:
将所述JAR文件包作为外部插件,利用DexClassLoader类加载器将所述JAR文件包加载至内存。
3.根据权利要求1所述的线上规则修改方法,其特征在于,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存的过程中,还包括:
获取所述外部插件中所有的资源标识号,并将所述资源标识号存放至预设JAVA文件;
生成用于存放所述预设JAVA文件的项目资源目录。
4.根据权利要求3所述的线上规则修改方法,其特征在于,所述将所述JAR文件包作为外部插件,包括:
通过Java代理模式,将所述JAR文件包作为外部插件以实现插件化。
5.根据权利要求4所述的线上规则修改方法,其特征在于,所述通过Java代理模式将所述JAR文件包作为外部插件,以实现插件化,包括:
通过Java代理模式,为所述JAR文件包对应的对象创建代理类;
将所述资源标识号添加至所述代理类,以便主程序通过所述代理类,根据所述资源标识号获取可执行文件。
6.根据权利要求1所述的线上规则修改方法,其特征在于,所述将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存之后,还包括:
基于Spring框架,在Spring容器初始化之前注册与所述外部插件对应的预设逻辑的监听器,然后对注册了所述监听器的外部插件当前所在的节点进行Bean实例化。
7.根据权利要求1至6任一项所述的线上规则修改方法,其特征在于,所述通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改,包括:
获取预设主程序调用接口;
基于JAVA反射机制,通过所述预设类加载器,在所述预设主程序调用接口所对应的实现类中确定用于动态调用所述JAR文件包的目标实现类,并调用所述目标实现类,以对所述待修改规则进行修改。
8.一种线上规则修改装置,其特征在于,包括:
待修改规则获取模块,用于获取待修改规则,并确定与所述待修改规则对应的JAR文件包;
加载模块,用于将所述JAR文件包作为外部插件,利用预设类加载器将所述JAR文件包加载至内存;
JAVA反射模块,用于通过JAVA反射机制对加载至内存的所述JAR文件包进行动态调用,以对所述待修改规则进行修改。
9.一种电子设备,其特征在于,所述电子设备包括处理器和存储器;其中,所述存储器用于存储计算机程序,所述计算机程序由所述处理器加载并执行以实现如权利要求1至7任一项所述的线上规则修改方法。
10.一种计算机可读存储介质,其特征在于,用于存储计算机程序;其中所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的线上规则修改方法。
CN202310393113.1A 2023-04-10 2023-04-10 一种线上规则修改方法、装置、设备及存储介质 Pending CN116755788A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310393113.1A CN116755788A (zh) 2023-04-10 2023-04-10 一种线上规则修改方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310393113.1A CN116755788A (zh) 2023-04-10 2023-04-10 一种线上规则修改方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN116755788A true CN116755788A (zh) 2023-09-15

Family

ID=87955931

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310393113.1A Pending CN116755788A (zh) 2023-04-10 2023-04-10 一种线上规则修改方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN116755788A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117555618A (zh) * 2023-11-30 2024-02-13 中科世通亨奇(北京)科技有限公司 存储插件实现方法、装置、电子设备及存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117555618A (zh) * 2023-11-30 2024-02-13 中科世通亨奇(北京)科技有限公司 存储插件实现方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
KR100270916B1 (ko) 망 관리 시스템 및 클래스 동적 추가 방법
CN111399840B (zh) 一种模块开发方法及装置
US10592312B2 (en) Message oriented middleware with integrated rules engine
CN106569880B (zh) 一种Android应用间动态共享资源的方法及系统
CN111064626B (zh) 配置更新方法、装置、服务器及可读存储介质
EP3582125A1 (en) System and methods with reduced complexity in the integration of exposed information models with applications
CN112769706B (zh) 组件化路由方法及系统
CN113805882A (zh) 应用程序开发的方法、装置、电子设备及存储介质
CN106775781B (zh) 减小应用安装包的方法、装置及电子设备
CN113760324A (zh) 构建微前端应用的方法和装置
CN111651219A (zh) 一种多模块项目配置文件管理的方法及设备
CN116755788A (zh) 一种线上规则修改方法、装置、设备及存储介质
CN109343970B (zh) 基于应用程序的操作方法、装置、电子设备及计算机介质
CN117112122A (zh) 一种集群部署方法和装置
WO2023083071A1 (zh) 视图交互方法、装置、电子设备及计算机可读介质
CN115374083A (zh) 数据源的切换方法、装置、电子设备及存储介质
CN115129348A (zh) 应用程序的资源更新方法、装置、设备及可读存储介质
Gracioli et al. An operating system infrastructure for remote code update in deeply embedded systems
CN113448689A (zh) 运行期Dubbo协议转换装置及方法
CN114816445A (zh) 系统平台架构、函数发布方法及装置、平台及存储介质
CN113032004A (zh) 在开发环境中管理开发作业的方法、设备和程序产品
CN106570143B (zh) 一种发送响应对象的方法和装置
CN110971665A (zh) 一种对接多类型存储的管理方法、系统、设备及存储介质
CN115080276B (zh) 应用程序功能动态开关方法、装置、存储介质及电子设备
CN117289906A (zh) 低代码应用开发方法、设备及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination