CN110162391A - 一种异步框架及其实现方法 - Google Patents

一种异步框架及其实现方法 Download PDF

Info

Publication number
CN110162391A
CN110162391A CN201910445875.5A CN201910445875A CN110162391A CN 110162391 A CN110162391 A CN 110162391A CN 201910445875 A CN201910445875 A CN 201910445875A CN 110162391 A CN110162391 A CN 110162391A
Authority
CN
China
Prior art keywords
event
asynchronous frame
consumer
queue
type
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
CN201910445875.5A
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.)
Inspur Cloud Information Technology Co Ltd
Original Assignee
Inspur Cloud Information 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 Inspur Cloud Information Technology Co Ltd filed Critical Inspur Cloud Information Technology Co Ltd
Priority to CN201910445875.5A priority Critical patent/CN110162391A/zh
Publication of CN110162391A publication Critical patent/CN110162391A/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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching

Abstract

本发明公开了一种异步框架及其实现方法,属于软件设计技术领域。本发明的异步框架,在异步框架中定义事件类型、事件载体、事件的生产者、事件的处理器及事件的消费者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。该发明的异步框架,将结果的返回与后续附加处理分离开,有效地避免了线程阻塞过多,以及界面响应过慢的问题,具有很好的推广应用价值。

Description

一种异步框架及其实现方法
技术领域
本发明涉及软件设计技术领域,具体提供一种异步框架及其实现方法。
背景技术
在大型的网站开发里面,通常请求从一个入口进来,然后程序把所有的东西都处理完,比如博客系统中,用户a给用户b点赞,一般都要给用户b发个通知;再比如OnlineJudge系统中,有人提交一套编程题,并不一定是马上就返回结果的,因为编程题要经过提交、编译、运行、出结果、再将结果回传,这个时候才能显示结果。如果处理编程题的这个任务队列是同步的,那么如果编程题提交很多的话,就会有很多很多的线程卡在那里,导致程序能处理的请求并发受到极大的限制,而且用户界面反应很慢,体验十分不好,给用户带来了很大不便。
发明内容
本发明的技术任务是针对上述存在的问题,提供一种将结果的返回与后续附加处理分离开,有效地避免了线程阻塞过多,以及界面响应过慢的问题的异步框架。
本发明进一步的技术任务是提供一种异步框架的实现方法。
为实现上述目的,本发明提供了如下技术方案:
一种异步框架,在异步框架中定义事件类型、事件载体、事件的生产者、事件的处理器及事件的消费者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
所谓异步化就是处理一个任务,分成两段,或者是分两个线程来执行,而不是一次把所有的做好。而且异步化还有一个好处是,如果是一些事件性的处理呢,我只需要关注这个事件就可以了,后面的处理就都是一样的了。通过这样的异步化处理,来提高网站的性能,以及提升界面的响应速度。
作为优选,所述事件类型为枚举类型,包括各种事件类型。
作为优选,所述事件的消费者为单独的线程或线程池。
我们有很多的事件处理器,事件和处理器之间的关系通过事件的消费者来维护,因为只有事件的消费者才知道队列里有哪些事件,并需要将它们分发出去,分发给不同事件的处理器,所以需要它来将事件和事件的处理器之间的关系建立起来。它的数据结构应该是一个map,key是eventType,value是一个存有关注此类型事件的不同事件的处理器的一个集合,这个应该在程序启动时就初始化好,所以让它实现InitializingBean接口的afterPropertiesSet方法,把数据初始化完成。另外我们通过实现ApplicationContextAware接口的setApplicationContext方法,来将spring的上下文ApplicationContext引入进来,利用上下文来找到所有事件的处理器接口的实现类。这些都初始化完成之后,就要起一个线程,让它一直从队列中去取事件,取出来的是一个字符串,我们先将它反序列化成Object,这样我们就能取到它的类型,然后再让所有关注此类型事件的处理器去一个一个执行就可以了。
作为优选,所述事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息。
事件载体,表示当时事件发生的现场,虽然不同的事件内容不一样,但是肯定有一些公共的东西,比如事件类型,触发者,触发的载体,载体的Id,载体的拥有者,还有一个扩展字段,map类型的exts,用于存放那些无法抽象成公共部分的信息,这些都是事件载体的一些属性,保存了后续处理所必需的信息。
作为优选,所述事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。比如BlockingQueue,可以用redis中的list数据结构来实现。这里,我们采用redis的实现方式,先定义一个redis中key值,比如是EVENT_QUEUE,然后将事件载体序列化之后存进去,序列化采用将Object转成String的方式。
一种的异步框架的实现方法,该方法自定义一个事件生产者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
作为优选,该方法具体包括以下步骤:
S1、定义事件类型;
S2、定义事件载体;
S3、定义事件的生产者;
S4、定义事件的处理器;
S5、定义事件的消费者。
作为优选,所述事件类型为枚举类型,包括各种事件类型;所述事件的消费者为单独的线程或线程池。
作为优选,所述事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息;所述事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。
与现有技术相比,本发明的异步框架的实现方法具有以下突出的有益效果:通过所述异步框架的实现方法,所有复杂请求都统一经过异步框架来处理,将结果的返回与后续附加处理分离开,有效地避免了线程阻塞过多,以及界面响应过慢的问题,提高网站的性能,以及提升界面的响应速度,具有良好的推广应用价值。
附图说明
图1是本发明所述异步框架的实现方法的流程图。
具体实施方式
下面将结合附图和实施例,对本发明的异步框架及其实现方法作进一步详细说明。
实施例
本发明的异步框架,在异步框架中定义事件类型、事件载体、事件的生产者、事件的处理器及事件的消费者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
事件类型为枚举类型,包括各种事件类型。
事件的消费者为单独的线程或线程池。
有很多的事件处理器,事件和处理器之间的关系通过事件的消费者来维护,因为只有事件的消费者才知道队列里有哪些事件,并需要将它们分发出去,分发给不同事件的处理器,所以需要它来将事件和事件的处理器之间的关系建立起来。它的数据结构应该是一个map,key是eventType,value是一个存有关注此类型事件的不同事件的处理器的一个集合,这个应该在程序启动时就初始化好,所以让它实现InitializingBean接口的afterPropertiesSet方法,把数据初始化完成。另外我们通过实现ApplicationContextAware接口的setApplicationContext方法,来将spring的上下文ApplicationContext引入进来,利用上下文来找到所有事件的处理器接口的实现类。这些都初始化完成之后,就要起一个线程,让它一直从队列中去取事件,取出来的是一个字符串,我们先将它反序列化成Object,这样我们就能取到它的类型,然后再让所有关注此类型事件的处理器去一个一个执行就可以了。
事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息。
事件载体,表示当时事件发生的现场,虽然不同的事件内容不一样,但是肯定有一些公共的东西,比如事件类型,触发者,触发的载体,载体的Id,载体的拥有者,还有一个扩展字段,map类型的exts,用于存放那些无法抽象成公共部分的信息,这些都是事件载体的一些属性,保存了后续处理所必需的信息。
事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。
比如BlockingQueue,可以用redis中的list数据结构来实现。这里,我们采用redis的实现方式,先定义一个redis中key值,比如是EVENT_QUEUE,然后将事件载体序列化之后存进去,序列化采用将Object转成String的方式。
一种的异步框架的实现方法,该方法自定义一个事件生产者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
如图1所示,该方法具体包括以下步骤:
S1、定义事件类型;
S2、定义事件载体;
S3、定义事件的生产者;
S4、定义事件的处理器;
S5、定义事件的消费者。
事件类型为枚举类型,包括各种事件类型。
事件的消费者为单独的线程或线程池。
事件的消费者首先要维护事件和事件处理器之间的关系,即不同的事件由哪些不同的事件处理器来处理,然后就是不断地中队列中去取出事件,来转发给事件处理器来处理。
定义了事件的生产者,具体负责将进来的事件,封装成事件载体,并推送到单向队列(或是优先队列)中去。
事件的处理器具体实现两个方法,一是得到这个处理器所关注的事件类型的一个集合的方法,二是对该事件进行业务逻辑处理的方法。
有很多的事件处理器,事件和处理器之间的关系通过事件的消费者来维护,因为只有事件的消费者才知道队列里有哪些事件,并需要将它们分发出去,分发给不同事件的处理器,所以需要它来将事件和事件的处理器之间的关系建立起来。它的数据结构应该是一个map,key是eventType,value是一个存有关注此类型事件的不同事件的处理器的一个集合,这个应该在程序启动时就初始化好,所以让它实现InitializingBean接口的afterPropertiesSet方法,把数据初始化完成。另外我们通过实现ApplicationContextAware接口的setApplicationContext方法,来将spring的上下文ApplicationContext引入进来,利用上下文来找到所有事件的处理器接口的实现类。这些都初始化完成之后,就要起一个线程,让它一直从队列中去取事件,取出来的是一个字符串,我们先将它反序列化成Object,这样我们就能取到它的类型,然后再让所有关注此类型事件的处理器去一个一个执行就可以了。
事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息。
首先将不同事件中公共的部分统一实现,比如事件类型、事件触发者、触发的载体、触发载体的Id、触发载体的拥有者,然后再实现一个扩展字段,用来保存事件中那些相异的信息。
事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。比如BlockingQueue,可以用redis中的list数据结构来实现。这里,我们采用redis的实现方式,先定义一个redis中key值,比如是EVENT_QUEUE,然后将事件载体序列化之后存进去,序列化采用将Object转成String的方式。
以上所述的实施例,只是本发明较优选的具体实施方式,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。

Claims (9)

1.一种异步框架,其特征在于:在异步框架中定义事件类型、事件载体、事件的生产者、事件的处理器及事件的消费者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
2.根据权利要求1所述的异步框架,其特征在于:所述事件类型为枚举类型,包括各种事件类型。
3.根据权利要求2所述的异步框架,其特征在于:所述事件的消费者为单独的线程或线程池。
4.根据权利要求3所述的异步框架,其特征在于:所述事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息。
5.根据权利要求4所述的异步框架,其特征在于:所述事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。
6.一种的异步框架的实现方法,其特征在于:该方法自定义一个事件生产者,通过事件生产者向单向队列中推送事件,然后由事件消费者来消费及分发,根据不同的事件类型,选择不同的方式来处理事件。
7.根据权利要求6所述的异步框架的实现方法,其特征在于:该方法具体包括以下步骤:
S1、定义事件类型;
S2、定义事件载体;
S3、定义事件的生产者;
S4、定义事件的处理器;
S5、定义事件的消费者。
8.根据权利要求7所述的异步框架的实现方法,其特征在于:步骤S1中,所述时间类型为枚举类型,包括各种事件类型;所述事件的消费者为单独的线程或线程池。
9.根据权利要求8所述的异步框架的实现方法,其特征在于:所述事件载体表示当时事件发生的现场,用于存放无法抽象成公共部分的信息;所述事件的处理器为事件的入口,由事件处理器去发事件,往单向队列里插事件,单向队列用Java中自带的队列。
CN201910445875.5A 2019-05-27 2019-05-27 一种异步框架及其实现方法 Pending CN110162391A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910445875.5A CN110162391A (zh) 2019-05-27 2019-05-27 一种异步框架及其实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910445875.5A CN110162391A (zh) 2019-05-27 2019-05-27 一种异步框架及其实现方法

Publications (1)

Publication Number Publication Date
CN110162391A true CN110162391A (zh) 2019-08-23

Family

ID=67629158

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910445875.5A Pending CN110162391A (zh) 2019-05-27 2019-05-27 一种异步框架及其实现方法

Country Status (1)

Country Link
CN (1) CN110162391A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112486478A (zh) * 2020-11-26 2021-03-12 上海悦易网络信息技术有限公司 一种基于领域驱动的事件处理方法及设备
CN112988144A (zh) * 2019-12-02 2021-06-18 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2003094014A1 (en) * 2002-05-01 2003-11-13 Bea Systems, Inc. High availability event topic
US6829771B1 (en) * 1999-08-03 2004-12-07 International Business Machines Corporation Method and apparatus for selectable event dispatching
CN102340495A (zh) * 2010-07-26 2012-02-01 中国移动通信集团广东有限公司 一种支撑跨系统业务联动的事件中心及其事件处理方法
CN103577251A (zh) * 2012-07-20 2014-02-12 中兴通讯股份有限公司 基于事件的互联网计算处理系统及方法
CN105068864A (zh) * 2015-07-24 2015-11-18 北京京东尚科信息技术有限公司 处理异步消息队列的方法及系统
CN106326016A (zh) * 2016-07-28 2017-01-11 武汉票据交易中心有限公司 一种多线程事件分发方法和系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6829771B1 (en) * 1999-08-03 2004-12-07 International Business Machines Corporation Method and apparatus for selectable event dispatching
WO2003094014A1 (en) * 2002-05-01 2003-11-13 Bea Systems, Inc. High availability event topic
CN102340495A (zh) * 2010-07-26 2012-02-01 中国移动通信集团广东有限公司 一种支撑跨系统业务联动的事件中心及其事件处理方法
CN103577251A (zh) * 2012-07-20 2014-02-12 中兴通讯股份有限公司 基于事件的互联网计算处理系统及方法
CN105068864A (zh) * 2015-07-24 2015-11-18 北京京东尚科信息技术有限公司 处理异步消息队列的方法及系统
CN106326016A (zh) * 2016-07-28 2017-01-11 武汉票据交易中心有限公司 一种多线程事件分发方法和系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
CODERLCP: "多线程实现简单的事件异步处理框架", 《HTTPS://WWW.CNBLOGS.COM/LCPLCPJAVA/P/6884420.HTML》 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112988144A (zh) * 2019-12-02 2021-06-18 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法
CN112988144B (zh) * 2019-12-02 2023-09-12 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法
CN112486478A (zh) * 2020-11-26 2021-03-12 上海悦易网络信息技术有限公司 一种基于领域驱动的事件处理方法及设备
CN112486478B (zh) * 2020-11-26 2023-08-11 上海万物新生环保科技集团有限公司 一种基于领域驱动的事件处理方法及设备

Similar Documents

Publication Publication Date Title
JP6908682B2 (ja) グラフに基づくプログラムの仕様の実行
US10885003B2 (en) Compiling graph-based program specifications
US10338782B2 (en) Specifying control and data connections in graph-based programs
US20190354348A1 (en) Specifying components in graph-based programs
US9760406B2 (en) Controlling data processing tasks
CN106687920B (zh) 管理任务的调用
Hilderink et al. A distributed Real-Time Java system based on CSP
CN106687919B (zh) 用于控制多个组件的执行的方法、系统和计算机可读介质
US20150127928A1 (en) Energy Efficient Multi-Modal Instruction Issue
WO2019047441A1 (zh) 一种通信优化方法及系统
JP6778193B2 (ja) データ処理タスクの制御
CN110162391A (zh) 一种异步框架及其实现方法
Hadjidoukas et al. torcpy: Supporting task parallelism in Python
US10768902B2 (en) Actor model programming
Yonezawa et al. Object-oriented concurrent programming in ABCL/1
Ino et al. A fine grained cycle sharing system with cooperative multitasking on GPUs
Cheng et al. A Design to Adapt Microkernel Inter-process Communication Mechanism
Kamal et al. An integrated runtime scheduler for MPI
WO2020005596A1 (en) Actor model programming
Bao et al. Towards a Reversible BPEL Debugger
Plattner et al. Workload Management and Scheduling
Collins Communicating with the Host Application

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
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20190823