CN112068875B - 一种基于java动态加载实现线索过滤策略***及方法 - Google Patents
一种基于java动态加载实现线索过滤策略***及方法 Download PDFInfo
- Publication number
- CN112068875B CN112068875B CN202010774141.4A CN202010774141A CN112068875B CN 112068875 B CN112068875 B CN 112068875B CN 202010774141 A CN202010774141 A CN 202010774141A CN 112068875 B CN112068875 B CN 112068875B
- Authority
- CN
- China
- Prior art keywords
- filtering
- strategy
- configuration file
- filtering strategy
- configuration item
- 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.)
- Active
Links
- 238000001914 filtration Methods 0.000 title claims abstract description 170
- 238000000034 method Methods 0.000 title claims description 47
- 238000011161 development Methods 0.000 abstract description 15
- 230000008859 change Effects 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007429 general method Methods 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/656—Updates while running
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提出一种基于java动态加载实现线索过滤策略***,包括策略池、可热更新配置文件模块和动态加载过滤策略模块;所述策略池,用以存放各种过滤策略;所述可热更新配置文件模块,用以动态更新过滤策略调配方案;所述动态加载过滤策略模块,用以根据可热更新配置文件模块中的调配方案,从策略池中获取过滤策略,动态实现策略过滤逻辑。本发明可自由配置过滤策略,随时更新,通过抽象灵活扩展过滤策略,把开发焦点由业务逻辑的实现转变成配置定义,无需更改代码,无需重启服务,从而使开发者更接近业务运营与用户,以实现过滤策略的快速更新,大大提高了开发效率,节约了开发成本。
Description
技术领域
本发明涉及一种基于java动态加载实现线索过滤策略***及方法,属于过滤策略更新应用技术领域。
背景技术
目前,汽车市场快速发展,各大厂商和经销商对线索的质量要求越来越高,于是在业务运营过程中,线索过滤策略的调配一直在不断的变化来满足经销商的需求,线索过滤策略的使用周期和使用顺序根据不同的线索来源会有不同的调配方案。
然而目前团队使用的技术并不能满足快速开发的需求,无法应对高频的线索过滤策略的更新。据调研,在每次变更过滤策略的时候,都需要更改代码,然后重启服务,高频的变化和重启,严重降低了开发效率。面对大量的线索过滤需求,无法做到快速响应和敏捷开发。
现有开发方案主要缺点是切换线索过滤策略,需要更改代码并重启服务。对于线索过滤,一般会用到如:敏感词过滤、重复名单过滤、经销商车系过滤、经销商黑名单过滤、城市地域过滤等过滤方案,在现有的业务中,不同的经销商,不同的线索来源,对接这些过滤方案的选择是不同的,而每次更换这些过滤方案,都需要经历重新写代码、编译、打包、发布的繁琐流程,这不仅使得开发效率低下,而且还造成代码质量下降。
发明内容
本发明是为解决现有技术中的问题而提出的,具体技术方案如下:
一种基于java动态加载实现线索过滤策略***,包括策略池、可热更新配置文件模块和动态加载过滤策略模块;
所述策略池,用以存放各种过滤策略;
所述可热更新配置文件模块,用以动态更新过滤策略调配方案;
所述动态加载过滤策略模块,用以根据可热更新配置文件模块中的调配方案,从策略池中获取过滤策略,动态实现策略过滤逻辑。
优选的,所述过滤策略,具体是指通过java抽象类定义的过滤策略方法,每个过滤策略方法实现自己的策略过滤逻辑。
优选的,所述可热更新配置文件模块采用基于kubernetes的ConfigMap文件作为配置文件,并实现配置文件的热更新。
进一步的,所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
进一步的,所述动态加载过滤策略模块包括ClassLoader,所述ClassLoader,用以根据配置文件中的配置项model所对应的内容获取一组过滤策略名称;用以根据配置文件中的配置项path所对应的内容获取所需要过滤策略的策略池的路径,得到对应过滤策略类的class文件字节码;用以根据配置文件中的配置项sort所对应的内容获取过滤策略对应的过滤策略类及执行顺序;所述ClassLoader动态加载策略类,将其实例化后运行其过滤方法。
一种基于java动态加载实现线索过滤策略方法,包括如下步骤:
步骤一:将根据过滤策略方法和模板定义的各种过滤策略放入策略池中;
步骤二:按照过滤策略需求定义配置文件;
步骤三:重新挂载配置文件,完成配置文件的热更新;
步骤四:服务自动读取最新的配置文件;
步骤五:ClassLoader根据配置文件内容动态加载并实例化过滤策略类,设置过滤策略顺序,按顺序执行过滤策略。
进一步的,所述配置文件是基于kubernetes的ConfigMap文件。
进一步的,所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
本发明可自由配置过滤策略,随时更新,通过抽象灵活扩展过滤策略,把开发焦点由业务逻辑的实现转变成配置定义,无需更改代码,无需重启服务,从而使开发者更接近业务运营与用户,以实现过滤策略的快速更新,大大提高了开发效率,节约了开发成本。
附图说明
图1是本发明一种基于java动态加载实现线索过滤策略***的***结构图。
图2是本发明一种基于java动态加载实现线索过滤策略***的内部结构图。
图3是本发明一种基于java动态加载实现线索过滤策略方法的工作流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1和2所示,一种基于java动态加载实现线索过滤策略***,包括策略池、可热更新配置文件模块和动态加载过滤策略模块;
所述策略池,用以存放各种过滤策略;
所述可热更新配置文件模块,用以动态更新过滤策略调配方案;所述可热更新配置文件模块采用基于kubernetes的ConfigMap文件作为配置文件,并实现配置文件的热更新;
所述动态加载过滤策略模块,用以根据可热更新配置文件模块中的调配方案,从策略池中获取过滤策略,动态实现策略过滤逻辑。对于以往的项目而言,需要用到的过滤策略或者方法,都是在服务启动的时候,就会去实例化,并且规定好执行模块和执行顺序,这非常的不灵活并且造成内存占用浪费。通过java抽象类定义过滤策略方法和公共模板,具体如下,通过该公共模板可定义各种过滤策略方法对应的逻辑。
通过抽象,我们可以很好的扩展后续新增的过滤策略,每新增一种过滤策略,只需要集成该抽象父类,按规范实现指定的抽象方法,实现自己的过滤逻辑即可。开发者不需要去写具体的过滤策略实例化以及过滤策略执行顺序逻辑代码,因为开发时不需要知道具体的过滤策略,过滤策略是通过文件动态配置的。
所述策略池,将定义好的所有线索过滤策略集中管理,和传统的资源池实现方案对比,该策略池只需要声明好对应的java类即可,在程序中,无需在服务启动的时候去集中、去实例化,无需用java集合集中管理,无需用工厂模式去实现对外提供获取策略的方法。在声明好对应的java类之后,在服务启动的过程中将所有的线索过滤策略的实现java类加载到jvm虚拟机中即可。
所述过滤策略,具体是指通过java抽象类定义的过滤策略方法,每个过滤策略方法实现自己的策略过滤逻辑。
所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
ConfigMap挂载配置如下
通过配置文件,我们可以定义过滤策略的调配方案,可以指定过滤策略的顺序以及个数。
以下为一个具体的过滤策略配置样例:
从上面配置项可以看出,
1、我们可以通过配置项model来定义一组过滤策略的名称;
2、通过配置项path来指定策略池的路径,前面说的,对于策略池我们只需要定义好文件加载进入到jvm即可,无需实例化,在动态加载模块我们会通过这个路径找到这些过滤策略。
3、通过配置项sort来指定需要哪些过滤策略以及过滤策略的顺序。
所述动态加载过滤策略模块包括ClassLoader,所述ClassLoader,用以根据配置文件中的配置项model所对应的内容获取一组过滤策略名称;用以根据配置文件中的配置项path所对应的内容获取所需要过滤策略的策略池的路径,得到对应过滤策略类的class文件字节码;用以根据配置文件中的配置项sort所对应的内容获取过滤策略对应的过滤策略类及执行顺序;所述ClassLoader动态加载策略类,将其实例化后运行其过滤方法。
开发者只需要通过java的ClassLoader去动态实例化对应的过滤策略类即可。步骤如下:
1、根据业务配置项model,获取配置文件中的过滤策略信息;
2、根据配置项path,获取所需要过滤策略的策略池的路径,拿到对应过滤策略类的class文件字节码;
3、根据配置项sort,获取过滤策略类以及执行顺序,通过ClassLoader在实际运行时动态加载策略类,将其实例化后运行其过滤方法,从而达到线索过滤的效果。
动态加载过滤策略模块的代码示例如下:
从上面代码块可以看出,在开发过程中,开发者并不需要知道最终会执行什么过滤策略,只需要根据运营要求,更新好配置文件,服务就会自动从配置文件中读取配置并执行指定的过滤策略。无需更改代码,无需重启服务,只需要简单修改配置文件就可以达到运营动态更改过滤策略的效果,大大提高了开发效率。
如图3所示,一种基于java动态加载实现线索过滤策略方法,包括如下步骤:
步骤一:将根据过滤策略方法和模板定义的各种过滤策略放入策略池中;具体为:首先定义好过滤策略模板方法,然后根据过滤策略模板方法定义各种过滤策略的逻辑;
步骤二:按照过滤策略需求定义配置文件;所述配置文件是基于kubernetes的ConfigMap文件;
步骤三:重新挂载配置文件,完成配置文件的热更新;
步骤四:服务自动读取最新的配置文件;
步骤五:ClassLoader根据配置文件内容动态加载并实例化过滤策略类,设置过滤策略顺序,按顺序执行过滤策略。
所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
当有新的过滤方案需要调整的时候,开发者只需在配置文件中编写过滤策略调配的逻辑内容。按照约定规范,先声明要使用的策略池的路径,即配置文件中的配置项path,再声明要使用的过滤策略类的顺序,即配置文件中的配置项sort,编写好配置文件后,重新挂载进入kubernetes的ConfigMap即可,这里只需要执行一行kubernetes命令,非常简单。挂载成功后,服务就会拿到最新的策略调配方案,然后对过滤策略进行更新。首先,要实例化过滤策略类,对于过滤策略类的实例化,开发者无需编写实例化逻辑,而是交给ClassLoader动态加载实例化去完成,过滤策略调配的这个过程对开发者是无感的,开发者无需理会具体的策略调配实现,ClassLoader首先会根据配置项path找到此次更新的策略池的位置,然后根据配置项sort的顺序,一个一个将具体的过滤策略实例化。当实例化完成之后,按照配置项sort的顺序,对过滤策略进行排序,排序完成之后,按照顺序更新执行,此时,当有新的线索过滤策略进入后,就会自动使用最新的线索过滤策略了。
本发明能够通过配置声明的形式,在不更新代码、不重启服务的情况下,动态更新过滤策略的调配方案,使开发变得更快速、更便捷,并且能够很好的应对线索过滤策略的变化需求,提高了整体效率。
以下为传统服务做法与本方案在替换过滤策略方案时的对比:
尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种基于java动态加载实现线索过滤策略***,其特征在于:包括策略池、可热更新配置文件模块和动态加载过滤策略模块;
所述策略池,用以存放各种过滤策略;所述过滤策略,具体是指通过java抽象类定义的过滤策略方法,每个过滤策略方法实现自己的策略过滤逻辑;
所述可热更新配置文件模块,用以动态更新过滤策略调配方案;
所述动态加载过滤策略模块,用以根据可热更新配置文件模块中的调配方案,从策略池中获取过滤策略,动态实现策略过滤逻辑;所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
2.根据权利要求1所述的一种基于java动态加载实现线索过滤策略***,其特征在于:所述可热更新配置文件模块采用基于kubernetes的ConfigMap文件作为配置文件,并实现配置文件的热更新。
3.根据权利要求1所述的一种基于java动态加载实现线索过滤策略***,其特征在于:所述动态加载过滤策略模块包括ClassLoader,所述ClassLoader,用以根据配置文件中的配置项model所对应的内容获取一组过滤策略名称;用以根据配置文件中的配置项path所对应的内容获取所需要过滤策略的策略池的路径,得到对应过滤策略类的class文件字节码;用以根据配置文件中的配置项sort所对应的内容获取过滤策略对应的过滤策略类及执行顺序;所述ClassLoader动态加载策略类,将其实例化后运行其过滤方法。
4.一种基于java动态加载实现线索过滤策略方法,其特征在于:包括如下步骤:
步骤一:将根据过滤策略方法和模板定义的各种过滤策略放入策略池中;所述过滤策略,具体是指通过java抽象类定义的过滤策略方法,每个过滤策略方法实现自己的策略过滤逻辑;
步骤二:按照过滤策略需求定义配置文件;
步骤三:重新挂载配置文件,完成配置文件的热更新;
步骤四:服务自动读取最新的配置文件;
步骤五:ClassLoader根据配置文件内容动态加载并实例化过滤策略类,设置过滤策略顺序,按顺序执行过滤策略;
所述配置文件包括配置项model、配置项path和配置项sort,所述配置项model,用以定义一组过滤策略的名称;所述配置项path,用以指定策略池的路径;所述配置项sort,指定过滤策略内容及策略顺序。
5.根据权利要求4所述的一种基于java动态加载实现线索过滤策略方法,其特征在于:所述配置文件是基于kubernetes的ConfigMap文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010774141.4A CN112068875B (zh) | 2020-08-04 | 2020-08-04 | 一种基于java动态加载实现线索过滤策略***及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010774141.4A CN112068875B (zh) | 2020-08-04 | 2020-08-04 | 一种基于java动态加载实现线索过滤策略***及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112068875A CN112068875A (zh) | 2020-12-11 |
CN112068875B true CN112068875B (zh) | 2024-05-17 |
Family
ID=73657641
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010774141.4A Active CN112068875B (zh) | 2020-08-04 | 2020-08-04 | 一种基于java动态加载实现线索过滤策略***及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112068875B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113434382A (zh) * | 2021-07-12 | 2021-09-24 | 建信金融科技有限责任公司 | 数据库性能监控方法、装置、电子设备及计算机可读介质 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090307685A1 (en) * | 2008-06-06 | 2009-12-10 | International Business Machines Corporation | Method, Arrangement, Computer Program Product and Data Processing Program for Deploying a Software Service |
CN102043653A (zh) * | 2010-12-23 | 2011-05-04 | 中国农业银行股份有限公司 | 缓存配置的修改方法、缓存数据的操作、查询方法及缓存*** |
CN104182685A (zh) * | 2014-08-19 | 2014-12-03 | 北京京东尚科信息技术有限公司 | 一种用于java web应用的xss防御方法及组件 |
CN104283947A (zh) * | 2014-09-28 | 2015-01-14 | 深圳市中科无软件有限公司 | Java script动态合并服务器及其工作过程 |
CN107632842A (zh) * | 2017-09-26 | 2018-01-26 | 携程旅游信息技术(上海)有限公司 | 规则配置和发布方法、***、设备及存储介质 |
CN109558316A (zh) * | 2018-11-21 | 2019-04-02 | 武汉风行在线技术有限公司 | 一种测试策略自动化配置的http接口动态化参数测试方法 |
CN109711149A (zh) * | 2017-10-25 | 2019-05-03 | 武汉安天信息技术有限责任公司 | 动态更新机制判定方法及应用全生命周期行为监控方法 |
CN109831500A (zh) * | 2019-01-30 | 2019-05-31 | 无锡华云数据技术服务有限公司 | Kubernetes集群中配置文件与Pod的同步方法 |
CN110262818A (zh) * | 2019-05-29 | 2019-09-20 | 北京达佳互联信息技术有限公司 | Java代码热更新方法、装置、电子设备及存储介质 |
CN110784360A (zh) * | 2019-11-01 | 2020-02-11 | 浪潮云信息技术有限公司 | 一种实现Kong声明式配置热更新的方法及*** |
CN110825369A (zh) * | 2019-11-07 | 2020-02-21 | 四川长虹电器股份有限公司 | 一种基于java语言的代码自动生成的方法 |
CN111258618A (zh) * | 2020-01-13 | 2020-06-09 | 深圳壹账通智能科技有限公司 | 文件配置方法、装置、计算机设备和存储介质 |
-
2020
- 2020-08-04 CN CN202010774141.4A patent/CN112068875B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090307685A1 (en) * | 2008-06-06 | 2009-12-10 | International Business Machines Corporation | Method, Arrangement, Computer Program Product and Data Processing Program for Deploying a Software Service |
CN102043653A (zh) * | 2010-12-23 | 2011-05-04 | 中国农业银行股份有限公司 | 缓存配置的修改方法、缓存数据的操作、查询方法及缓存*** |
CN104182685A (zh) * | 2014-08-19 | 2014-12-03 | 北京京东尚科信息技术有限公司 | 一种用于java web应用的xss防御方法及组件 |
CN104283947A (zh) * | 2014-09-28 | 2015-01-14 | 深圳市中科无软件有限公司 | Java script动态合并服务器及其工作过程 |
CN107632842A (zh) * | 2017-09-26 | 2018-01-26 | 携程旅游信息技术(上海)有限公司 | 规则配置和发布方法、***、设备及存储介质 |
CN109711149A (zh) * | 2017-10-25 | 2019-05-03 | 武汉安天信息技术有限责任公司 | 动态更新机制判定方法及应用全生命周期行为监控方法 |
CN109558316A (zh) * | 2018-11-21 | 2019-04-02 | 武汉风行在线技术有限公司 | 一种测试策略自动化配置的http接口动态化参数测试方法 |
CN109831500A (zh) * | 2019-01-30 | 2019-05-31 | 无锡华云数据技术服务有限公司 | Kubernetes集群中配置文件与Pod的同步方法 |
CN110262818A (zh) * | 2019-05-29 | 2019-09-20 | 北京达佳互联信息技术有限公司 | Java代码热更新方法、装置、电子设备及存储介质 |
CN110784360A (zh) * | 2019-11-01 | 2020-02-11 | 浪潮云信息技术有限公司 | 一种实现Kong声明式配置热更新的方法及*** |
CN110825369A (zh) * | 2019-11-07 | 2020-02-21 | 四川长虹电器股份有限公司 | 一种基于java语言的代码自动生成的方法 |
CN111258618A (zh) * | 2020-01-13 | 2020-06-09 | 深圳壹账通智能科技有限公司 | 文件配置方法、装置、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112068875A (zh) | 2020-12-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7484223B2 (en) | System and method for building a run-time image from components of a software program | |
US7133874B2 (en) | Prototyping model for components of a software program | |
US7428559B2 (en) | Versioning model for software program development | |
CN110147225A (zh) | 一种代码生成方法、装置及计算机设备、存储介质 | |
CN103984582A (zh) | 一种热更新方法和装置 | |
JPH047640A (ja) | クラス継承解決処理方法 | |
CA2398148C (en) | System and method for managing bi-directional relationships between objects | |
CN105487907A (zh) | 一种差分包的制作方法和装置 | |
CN112835714A (zh) | 云边环境中面向cpu异构集群的容器编排方法、***及介质 | |
US8615729B2 (en) | Extending existing model-to-model transformations | |
CN106599167B (zh) | 一种支持增量升级数据库的***和方法 | |
CN112068875B (zh) | 一种基于java动态加载实现线索过滤策略***及方法 | |
US20040088687A1 (en) | Code analysis for selective runtime data processing | |
CN114942933A (zh) | 一种自动更新数据库的方法及相关装置 | |
US20060130034A1 (en) | Apparatus, system, and method for providing access to a set of resources available directly to a particular class loader | |
CN104331275A (zh) | 一种Java卡及其应用打补丁的方法 | |
CN106293790A (zh) | 基于Firefox操作***的应用程序升级方法和装置 | |
CN115129740B (zh) | 一种云原生环境下的分布式微服务数据库更新方法及*** | |
CN109144486B (zh) | 一种无状态化的工作流程实现方法 | |
CN103761118A (zh) | 一种智能卡及智能卡内部署应用的方法 | |
CN110308914B (zh) | 升级处理方法、装置、设备、***及计算机可读存储介质 | |
JP4959003B2 (ja) | 反復コンポーネントのバインディング | |
CN114610351A (zh) | 一种数据库升级方法 | |
CN112860345A (zh) | 插件管理方法及装置 | |
CN112860248B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |