同一进程下多应用模块客户端的异常处理方法与流程

文档序号:15729878发布日期:2018-10-23 17:03阅读:407来源:国知局
同一进程下多应用模块客户端的异常处理方法与流程

本发明涉及信息技术领域,特别涉及一种同一进程下多应用模块客户端的异常处理方法。



背景技术:

根据不同企业实际业务的需求,生产过程管理信息系统一般可划分为多个不同的功能模块,在系统开发过程中,往往将整个系统划分为不同子功能模块由不同开发人员分别开发,最后根据实际需求动态将各个子功能模块加载到系统中去。

上诉开发方式虽然灵活,但是系统存在较大的安全隐患,当某一子模块的开发人员没有将其内部异常问题处理完全就集成到系统,子模块抛出异常时,异常问题会传导到整个系统,导致整个系统无法正常运行。不同的子模块运行在同一个进程中,相互间可以访问对方的数据,容易造成对数据的误操作,抛出业务逻辑异常,而生产过程管理信息系统对系统稳定性及业务逻辑的正确性要求较高,系统的停滞会为现场生产造成较大困扰。

因此要保证整个系统安全稳定的运行,就需要在整合各个功能模块的同时,在系统级别加入异常处理机制,来隔离各个子功能模块的异常问题,使异常问题传导的级别降低到子模块内部,这样便可以较大程度的提高整个系统的稳定性,同时对各子模块的数据进行隔离,避免因不同模块间对数据的误操作而抛出业务逻辑异常。



技术实现要素:

针对现有技术中存在的上述不足之处,本发明提出了一种同一进程下多应用模块制造执行系统的客户端异常处理方法,在系统级别控制不同功能模块抛出的异常问题,本发明采用的技术方案是:一种同一进程下多应用模块客户端的异常处理方法,包括以下步骤:

创建功能单元Mi:以系统中相互独立的子模块作为功能单元,由功能单元集合构成的整个系统S={M1,M2,M3,……,Mn}寄宿在单一进程P中;

系统S在其寄宿进程P中为各个功能单元Mi创建应用程序域:其中Ai∈{A1,A2,......,An};

将各个功能单元Mi寄宿到应用程序域Ai中:Ai{Mi};

系统集成各应用程序域及功能单元:

系统及各个功能单元寄宿在单一进程中:P(S(Ai{Mi}));

当不同的功能单元之间存在业务关联时,采用跨应用程序域的数据传递方法进行不同的功能单元之间的数据传递;

当功能单元发生异常时,系统将该功能单元卸载。

所述系统为生产制造执行系统时,根据业务功能,将功能单元划分为:计划排产、计划调度、生产追踪、报警管理、物料管理、质量管理、设备管理、工装工具管理、工艺管理、KPI统计分析,针对每个功能单元创建独立的动态运行库。

所述为功能单元创建并配置应用程序域,具体过程如下:

使用System.AppDomain类来创建应用程序域,

使用AppDomainSetup类来配置应用程序域,配置过程如下:(a)、指定应用程序域名称;(b)、指定应用程序域根目录;(c)、指定应用程序域属性:独立域/中立域;(d)、指定应用程序域的安全策略。

所述采用跨应用程序域的数据传递方法进行不同的功能单元之间的数据传递,具体为:

(a)、传值方式:首先将某应用程序域要传递的对象字段序列化到一个内存块中,然后将该内存块传递给另一个应用程序域,最后再执行反序列化得到新的对象。

(b)、传引用方式:当对象的引用被传递给一个目的应用程序域时,CLR会在目的应用程序域中创建一个代理类型的实例,目的应用程序域中的代码将使用这个代理实例来引用对象。

所述系统将发生异常时的功能单元的卸载,具体为:

获取发生异常模块所在应用程序域名称;

调用应用程序域卸载函数:System.AppDomain.Unload卸载应用程序域;

释放该应用程序域中的所有资源。

本发明具有以下优点及有益效果:

1.能够有效控制系统异常问题影响范围,安全隔离各个功能模块,保障系统安全,提高系统稳定性。

2.在满足大系统分模块开发需求的同时,在系统层控制不同子模块抛出的异常问题,最大限度的避免了由于子模块代码异常及业务逻辑异常而造成的系统错误。从而可以防止由于子模块开发人员对代码处理的不完善而暴露的异常问题传导至整个系统,导致整个系统的崩溃,确保系统能够长期稳定的运行。

3.该方法充分利用了应用程序域自身特性及安全机制,将功能单元异常信息控制在了所在的应用程序域内部,避免了异常错误无限传导到整个系统。同时利用应用程序域的隔离功能,能够防止不同功能单元之间对数据对象的直接引用,避免了由于数据误操作而引起的业务异常。

4.实现对各个业务功能单元的动态集成及卸载功能,根据业务需求可以动态的将不同的功能单元集成到系统形成能够满足特定需求的制造执行系统,同时当某一功能单元发生异常时,系统能够自动将该功能单元卸载,确保不会影响到其他功能单元的稳定运行。

附图说明

图1主框架加载功能单元方式图;

图2系统集成方式图。

具体实施方式

下面结合附图1、2详细介绍本方法的具体实施方式。

首先生产制造执行系统涉及的范围广泛,可划分为多个独立的功能模块,各功能模块即相互独立也互相关联,在程序开发和集成过程中尽量确保各个子功能模块之间松散耦合,这种相互独立的子功能模块在本发明中称之为功能单元,用Mi表示,功能单元集合如:(M1、M2、M3……),整个生产制造执行系统(S表示系统)统寄宿在单一进程(P表示进程)中,并且由多个功能单元组成,所以导致所有功能单元都属于同一进程。为了充分的隔离每个功能单元,我们引入了应用程序域,用Ai表示,应用程序域集合如:(A1、A2、A3……),利用应用程序域自身的特性来实现对功能单元的隔离功能。每一个功能单元都寄宿到一个单独的应用程序域中,最后系统统一加载各个应用程序域,实现对各功能单元的集成,方法描述如下:

(a)、功能单元的创建:

Define{M1、M2、M3……}。

(b)、系统在其寄宿进程中为各个功能单元创建应用程序域:

其中Ai∈{A1、A2、A3......}。

(c)、各功能单元寄宿到应用程序域:

Ai{Mi}

(d)、系统集成各应用程序域及功能单元,见图1所示:

其中Ai{Mi}∈{A1{M1}、A2{M2}、A3{M3}......}。

(e)、系统及各个功能单元寄宿在单一进程中:

P(S(Ai{Mi}))

将制造执行系统划分为多个功能单元M1、M2、M3……,每个功能单元寄宿到独立的应用程序域Ai{Mi},同时系统可以创建多个应用程序域,每个应用程序域加载不同的功能单元Ai{Mi}∈{A1{M1}、A2{M2}、A3{M3}......},整个系统运行在唯一的进程中P{S},实现系统运行于单进程,而功能单元寄宿于多应用程序域。系统可以根据需要动态加载或者卸载某一功能单元所在的应用程序域,从而实现功能单元与系统的插拔式动态集成方式,系统的集成方式见图2所示。

当制造执行系统不同的功能单元之间存在业务关联时,这时就存在跨应用程序域的数据传递,一个应用程序域中的代码可以和另一个应用程序域中的类型和对象相互通信,但是这样的通信必须通过一种预先定义的机制进行,跨应用程序域的数据传递方法描述如下:

(a)、传值方式:首先将某应用程序域要传递的对象字段序列化到一个内存块中,然后将该内存块传递给另一个应用程序域,最后再执行反序列化得到新的对象。

(b)、传引用方式:当对象的引用被传递给一个目的应用程序域时,CLR会在目的应用程序域中创建一个代理类型的实例,目的应用程序域中的代码将使用这个代理实例来引用对象。

具体实施步骤如下:

一、创建功能单元

根据业务功能,划分功能单元,将相对独立的功能划分为独立的功能单元,生产制造执行系统通常可划分如下几个相对独立功能单元:计划排产、计划调度、生产追踪、报警管理、物料管理、质量管理、设备管理、工装工具管理、工艺管理、KPI统计分析,针对每个功能单元创建独立的动态运行库。

二、为功能单元创建并配置应用程序域

使用System.AppDomain(应用程序域命名空间)类中重载的CreateDomain(创建应用程序域函数)创建应用程序域,可以为应用程序域命名并按该名称来引用应用程序域,如:

AppDomain domain=AppDomain.CreateDomain(AppDomainName)。

使用AppDomainSetup(应用程序域设置类)为新应用程序域提供带有配置信息的公共语言运行库,创建自己的应用程序域时,最重要的属性是ApplicationBase(程序集根目录),其他AppDomainSetup(应用程序域设置类)类属性主要用于运行时宿主配置特殊的应用程序域。

三、系统加载功能单元

在主框架加载功能单元的同时,首先需要创建新的应用程序域,并将功能单元寄宿到创建的应用程序域中,具体代码如下:

newdomain.CreateInstanceAndUnwrap(ComName,ClassName)。

四、功能单元间通信

当功能单元之间存在数据通讯时,涉及到不同应用程序域之间的数据交互,主要通过值传递和引用传递两种方式来实现对不同应用程序域之间的数据传递。

五、系统卸载功能单元

当功能单元发生异常时,系统需要自动将该功能单元卸载,避免影响整个系统的稳定性。例如:当MES系统生产追踪模块发生异常时,系统主框架根据异常发生的位置及所在动态库名称获取生产追踪子模块所在的应用程序域名称(如:ProductTrackDomain),系统主框架根据应用程序域名称调用应用程序域卸载函数:System.AppDomain.Unload(“ProductTrackDomain”)来卸载生产追踪子模块。通过卸载应用程序域的方法来卸载发生异常的生产追踪子模块,系统会正常关闭生产追踪子模块,使其不会再向主框架抛出异常。卸载过程中没有新线程可以访问该应用程序域,并且会释放该应用程序域特定的所有数据结构。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1