没有合适的资源?快使用搜索试试~ 我知道了~
基于Java的组件系统交互框架的理论计算机科学电子笔记154(2006)43-61
理论计算机科学电子笔记154(2006)43-61www.elsevier.com/locate/entcs基于Java的构件系统中工程交互的框架Antonio Natali,Enrico Oliva,Alessandro Ricci,Mirko ViroliDEIS,AlmaMaterialum,Universita`diBologna,viaVenezia 52,I-47023切塞纳,意大利{anatali,eoliva}@ deis.unibo.it{a.ricci,mirko.viroli}@ unibo.it摘要本文描述了一个基于Java的框架,用于开发基于组件的软件系统,支持将组件交互的逻辑规范作为第一类方面。Java被用作参考开发语言。一方面,该框架使得在组件级指定交互的逻辑成为可能,在输入和输出接口方面,组件以及关于控制流的管理的相关信息。 另 另一方面,可以在组件间级别指定交互的逻辑,为设计和(动态)编程组件之间的粘合剂提供建模和语言支持,从而实现交互空间的一般形式的观察,控制和构建。因此,该框架支持不同级别的组件协调:从异构和未知组件之间的互操作性,到支持组件的动态引入、删除和更新,再到一般的协调模式,如工作流。 该框架采用一阶逻辑作为描述和定义交互逻辑的参考计算模型:组件交互所采用的模态,粘合组件的协调定律以及系统中发生的交互事件都表示为事实和规则。它们组成了描述和定义系统级交互的(进化的)逻辑理论,并且可以在运行时被观察和控制,以允许动态重新配置。1介绍如今,基于组件的技术和框架(通常称为组件软件)可以被认为是设计和开发复杂软件系统的主流方法[13]。最常用的框架的例子包括作为J2EE体系结构一部分的EJB(企业Java bean)、作为CORBA中间件一部分的CCM(CORBA组件模型),以及1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2005.12.03244A. Natali等人理论计算机科学电子笔记154(2006)43DCOM/COM+及其在.NET平台上的未来化身[13]。一些面向服务的框架,如OSGi [11],本质上可以被认为一般来说,现有的主流方法基本上都是基于一种“乐高式”的软件系统愿景:重点是组件的概念,作为一个基本的砖组成系统,无论是组合本质上是通过显式声明组件提供的用于利用其服务的接口以及实现其服务所需的接口来接口作为连接组件的依赖关系的正式描述-作为(乐高)积木的接头。因此,这导致软件工程师在应用程序设计和开发方面的原因,实体.实际上,在处理现代软件系统的工程时,这种方法可以被认为是相当弱的当前的主流方法并没有为指定和管理组件之间的交互提供一流的支持:大多数支持涉及解决静态依赖关系,其中组件(动态)从系统中引入或删除。回到乐高的比喻,从动态的角度来看,将砖块组合并连接在一起是不够的:某种动态和相互作用可能导致整个系统崩溃,即使砖块以正确的方式(静态)连接并正确地完成工作在这项工作中,我们提出了一个框架,用于支持基于组件的系统,顶部的面向对象的主流技术,如Java,它提供了一个一流的支持表示,制定和控制系统内的交互。该方法不考虑单个组件作为基于组件的系统的设计和开发的中心:这个角色由交互逻辑扮演,它根据比标准面向对象接口更丰富的交互概念将组件粘合在一起。特别是,该框架可以在两个不同的层次上描述交互的逻辑:在组件层次上,指定单个组件的交互能力;在系统层次上,指定定义和管理交互的定律,这些定律不涉及系统的特定组件,而是将组件的整体集成在一起。总体而言,该框架使得采用主流技术(包括其他A. Natali等人理论计算机科学电子笔记154(2006)4345Fig. 1. 组件和内核基于组件的框架,如OSGi和EJB -但在更高的抽象层次上提供了对管理交互的支持,重点是交互的逻辑。本文的其余部分组织如下:第2节介绍了框架所基于的原则,第3节描述了框架如何在Java平台上实现,第4节重点介绍了基于一阶逻辑的内核的具体实例,第5节举例说明了在框架上构建的简单基于组件的系统的方法,最后第6节总结了本文。2框架:愿景该框架引入了两个第一类抽象来表示组件和它们所处的环境,以便更好地支持微观(组件)和宏观(系统)级别:演员1和内核(见图1)。①的人。参与者扮演系统组件的角色,作为部署的基本单元,嵌入某种业务逻辑。它们是为了执行某种任务,例如提供服务,由某种形式的刺激的接收触发。作为组件,参与者可以动态地引入内核或从内核中删除。1尽管有这个名字,但参与者的概念并不直接与Carl Hewitt引入的参与者抽象相关联,而是指能够交互的组件,如下所述46A. Natali等人理论计算机科学电子笔记154(2006)43内核显式地表示组件环境,为参与者提供支持其交互的特定服务。一个系统由一个内核和一组动态的参与者组成,这些参与者通过同一个内核链接和连接。在某种程度上,内核抽象类似于当前组件框架中的容器概念,扩展到可配置和可编程的协调媒介[4]。与参与者一样,内核也可以动态扩展和替换。2.1交互信号和交互原语从交互的角度来看,演员可以被视为正常的对象,具有产生和感知交互信号的能力。特别地,它们通过对某些交互信号的接收做出反应来提供它们的服务,并且通过生成信号来触发服务的执行。交互信号是交互词汇表的基本组成部分,可用于定义表征组件系统的交互逻辑。在这个框架中,这样一个概念以最简单的方式表示为一对(n,v),其中n标识信号的名称, 五是信息内容。每个组件的特征在于它最终可以生成的交互信号集(输出接口)和它在其寿命期间可以接收的交互信号集(输入接口)。这些集合必须为每个组件明确定义,并在组件引入系统时在环境中声明/发布。因此,交互信号旨在指定参与者之间的交互形式,最大限度地减少它们之间的(静态)依赖关系:组件不直接与其他组件直接交互,直接知道它们的引用和调用方法,而是间接生成和感知共享的信号集。对于输出接口,内核为参与者提供了一组基本的交互原语,参与者可以使用这些原语生成交互信号。这些原语对于描述交互语义的一些基本方面非常重要,特别是行为的态度或意图以及对该行为的期望。 目前,基本集合包括三个原语:• 通知- 用于发出交互信号,以使与组件的状态或行为相关的某种参与者发射器对接收任何类型的信息作为操作的结果• 通知-用于发出交互信号,以通知其环境某些信息,以触发某种活动或回答A. Natali等人理论计算机科学电子笔记154(2006)4347过去收到的请求。如果信息已完全传递到环境中,则原语成功,否则生成InformException• 调用-用于发出交互信号以执行服务并接收相应的结果。然后,原语作为传统的RPC或方法调用工作,并将结果作为调用的返回参数提供。如果服务无法交付,原语将生成一个异常ExceptionException值得注意的是,所有原语都是为了生成一个信号而不指定目标参与者:将接收信号的组件或组件集取决于为系统定义并由内核执行的特定交互逻辑,如下一小节所示一般来说,原语集定义并约束了内核提供的交互支持的表达能力。这里的目标是分解在构建基于组件的系统时最常见的交互需求,抽象出交互如何发生(例如,通过消息传递或共享内存,本地或分布式)以及使用哪种技术,专注于交互的逻辑。因此,相同的原语-具有相同的语义-可以在部署阶段由不同种类的内核支持,采用不同种类的实现策略和技术,这取决于计算和硬件环境。与发出信号的交互原语集一样,每个参与者必须提供一个带有doAction操作的接口,从环境的角度来看,该操作用于获得参与者能够提供的服务。特别是,doAction指定了参与者对接收到参与者在其输入信号中声明的任何交互信号做出反应的行为。该操作可以直接返回一些结果-表示所调用的服务的返回值,并且可以生成一个Docs异常来表示与服务执行相关的某种运行时错误,例如由于错误的参数而导致的(语义 ) 违 反 合 约 。 服 务 的 执 行 还 可 以 导 致 输 出 信 号 的 生 成 ( 使 用notify/inform/invoke原语),例如用于通知某种事件或用于执行某些其他服务。2.2核中介和相互作用定律然后,内核的作用是充当粘合剂,其使得能够、介导和控制某些组件的输出交互信号的生成,这些输出交互信号可以成为其他组件的输入交互信号换句话说,48A. Natali等人理论计算机科学电子笔记154(2006)43图二、通知、通知和调用原语的内核默认行为从逻辑的观点来看,内核扮演着交互人工制品的角色,分解用于管理组件依赖性和动态交互的服务。内核的默认行为是根据参与者声明要生成或感知的交互信号的名称启用交互。特别是(见图)。2用于图形描述):• 由参与者生成的带有通知的信号导致执行doAction操作-以交互信号作为参数-所有在输入信号中列出信号的演员。发射器参与者对知道关于调用的结果的任何信息不感兴趣,因此内核可以例如尽其最大努力以尽可能异步地实现调用;• 用invoke生成的信号导致在一个参与者上执行doAction,该参与者是invoke原语的返回值直接是doAction操作提供的结果特别是,内核旨在提供最佳的排序,以找到一个执行动作而不会失败的演员。因此,如果在所选的参与者上执行操作失败(生成Docs异常),则将使用另一个参与者-例如。非决定论地- 从剩余的服务中选择一个,并且操作doAction将再次在其上执行;如果 没有 发现 提 供无 异常 服务 的 参与 者, 则调 用将 通过 生成 一 个ExceptionException而失败。• 使用inform生成的信号导致在所有在输入信号中列出信号的演员原始A. Natali等人理论计算机科学电子笔记154(2006)4349如 果 内 核 能 够 将 信 号 传 递 给 每 个 人 , 即 在 所 有 参 与 者 上 执 行doAction,则成功,尽管每个参与者可能生成DoAction Exception除了这些基本的交互原语之外,内核实际上可以扩展为定义交互定律提供服务,以便直接支持一些基本的交互模式,而不仅仅是基本的粘合行为。这些定律可以在系统的(重新)配置阶段指定,这可以在应用程序执行期间的任何时候发生。框架中目前支持的模式实际上是主流基于组件的系统中最常用的一些模式,例如Enterprise Java Bean,但在更高的抽象级别上工作• 事件监听• 交互-否决-更准确地说,内核服务可以指定特定的接收者参与者的特定输入信号可以由特定的否决者参与者否决;动态地,只有当没有指定为否决者的参与者不同意时,才会将指向接收者的交互信号实际发送到组件。更复杂的定律可以通过组合多个简单反应和否决规则的具体化来获得。目前正在研究其他一些方法,以实现更多面向协调的交互模式,丰富内核提供的基本支持。示例包括指定约束的能力,例如通知侦听器的顺序,或事务类场景中的原子性/一致性。值得注意的是,用语义信息丰富交互方面的描述提高了对组件本地开发原则的支持,更一般地说,提高了对工程开放和可扩展系统的支持。组件的设计和开发通常不需要事先了解它们将被部署到的特定环境;关于组件交互语义的信息的可用性-超越纯粹的语法方面-简化了内核的集成和动态粘合:例如,这是通过应用某种协调规则来实现的,尽管在生成/感知的交互信号之间存在语法和语义不匹配,但组件之间的一致性仍然存在。50A. Natali等人理论计算机科学电子笔记154(2006)43图3.第三章。框架中元素的架构视图2.3有线和空间交互模式内核通过向参与者注入实现交互所需的逻辑来实现其中介角色。 特别是,这可以根据两种基本的不同形式发生,称为空间和有线,这基本上可以被视为内核的不同实现方法。在前一种情况下,内核实际上是一个逻辑和运行时实体,在组件生成信号或被信号激励时共享和访问;在这种情况下,注入组件的逻辑只是提供对内核的基本交互行为。在后者中,所有的对等交互逻辑都被注入到组件中,而没有任何运行时集中实体。换句话说,在有线的情况下,内核是完全分布式的,直接注入到组件中;组件系统在运行时成为一个交互网络,演员扮演节点的角色,逻辑上沉浸在共享环境中,但实际上是有线的,以便进行直接的,非中介的交互。3规范和实施问题在本节中,我们将描述此框架当前设计的主要方面,包括体系结构和实现细节的规范。内核和Actor之间的关系是利用控制的内版本(IoC)模式2实现的:一些配置代码负责在Actor内部注入对内核的引用,以便后者可以直接访问其环境,而不负责检索它。在图3中,表示了组成框架的元素。一方面,参与者组件应该提供接口IActor,即通过实施它,定义它提供给IoC模式现在正在成为在基于组件的系统中开发容器的标准方法(http://www.devx.com/Java/Article/27583)。A. Natali等人理论计算机科学电子笔记154(2006)4351其他参与者和内核。这些包括配置参与者本身的方法,以及实现参与者实现的服务的方法,用于接收信号。另一方面,参与者组件应该要求接口ICernel--也就是说,参与者通过IoC模式引用的内核应该实现ICernel接口。这个接口包括向内核注册一个actor、声明它的输入和输出信号以及调用内核交互原语(发出信号)的方法。表1显示了对这些操作进行分类的可能方法。IActor接口在配置时用于将内核注入到Actor实例中,并由内核在交互时调用服务。IKernel接口在配置时用于注册Actor及其信号,在交互时由Actor调用交互原语。操作性因子IKernel配置时间注入内核向内核相互作用时间请求执行操作/服务对交互原语进行建模表1接口结构3.1性因子在我们框架的实际体现中,一个角色被表示为一个Java类,它必须实现标准接口IActor:接口IActor扩展IActor Base,IActor规范{}该接口简单地扩展了IActor Base和IActor Specification,分别描述了交互时和配置时功能。前者简单地提供方法doAction-它具有前面部分描述的语义-用于执行由参与者实现的服务。特别地,这是由内核调用的,作为来自另一个参与者的请求的响应,实现服务的执行和结果的返回。一个这样的调用也可能由于多种原因而失败--错误的参数、访问后端服务失败等等--在这种情况下,执行会抛出一个异常。接口IASIS Base {Object doAction(String actionName,Object arg)抛出Docker异常;}52A. Natali等人理论计算机科学电子笔记154(2006)43参数actionName表示所请求服务的名称,参数arg表示为描述所请求服务的详细信息而提供的输入信息;一般来说,输出结果的类型为Object。接口IActorSpecification提供了在配置时使用的所有操作,通过这些操作可以确认参与者在系统中的存在。public String getName();public String getInputSignals();public String [] getOutputSignalsNotify(); public String []getOutputSignalsNotify()public String[] getOutputSignalsNotify()public voidsetKernel(IKernel kernel kernel);public IKernel getKernel();public boolean isActive();}方法getName返回Actor的名称-在运行应用程序。方法getInputSignals由内核使用检索参与者能够处理的所有输入信号,即doAction愿意接受的actionName。方法getOutputSignalsNotify/Invoke/Inform返回Actor可以生成的输出信号,即它可以请求的服务的actionName列表-通过notify、invoke或inform。方法setKernel和getKernel根据IoC模式存储和检索对actor连接到的内核的引用在当前的版本中-在框架的一个版本中,参与者实现了其他接口,这些接口允许在参与者中注入JavaBean组件框架的一些基本支持3.2IKernelIKernel是任何内核都必须实现的标准接口,它提供了每个参与者都可以访问的方法,以便与其他参与者进行交互或注册其输入和输出信号。接口IKernel {void notify(IActor emitter,String signalName,Objectargs); void notify(IActor emitter,String signalName,Object args)抛出InformException;Object invoke(IActor emitter,String signalName,Objectargs)抛出异常;String name(String name,String name,String name);String sort(String sort,String sort);void IActor emitter ( String[] signals ) ; void IActor emitter(String [] signals); void IActor emitter(String [] signals);}由于参与者可以以三种不同的方式调用服务,因此此接口提供了提供了三个相应的方法notify、inform和invoke。方法A. Natali等人理论计算机科学电子笔记154(2006)4353notify用于向感兴趣的参与者发送信号,而实际上不关心任何应答结果或任何确认,因此它不会抛出异常。方法inform用于向感兴趣的参与者发送信号:不返回结果,但操作结束意味着所有感兴趣的参与者都处理了信号。最后,方法调用用于向一个可以执行服务的代理请求服务,并相应地接收响应。在所有情况下,内核都有责任检索能够使用指定名称执行服务的参与者(一个或多个),调用他们的doAction名称,并正确地向发出的参与者提供确认/回复。其他方法由参与者用来注册关于其接口的信息-在术语的基于组件的接受中。 方法AcoureNode、AcoureInputSignal和AcoureOutputSignals分别注册系统中参与者的存在、其输入信号(它实现的服务)和其输出信号(它在其他参与者上调用的服务)。3.3相互作用定律除了提供基本的交互支持、概念性地链接输入和输出信号以及保证服务请求的三种不同语义之外,还可以实现内核以支持交互规则。这些都是在所有那些情况下,更先进的协调能力是负责对内核。如前一节所述,此类定律的示例包括支持事件侦听和否决语义的定律每一条这样的法则都与内核类必须实现的适当接口相关联 该接口提供了用于配置交互定律的方法(或多个方法),从而扩展了对方法ICernel.invoke、ICernel.inform和ICernel.notify的后续调用的底层语义。 因此,这种机制用于更改内核的默认语义,其中信号仅基于其名称的匹配而与输出信号相关联。对于事件-侦听器交互定律,我们有例如接口:public interfaces IReactInteraction{ public void reactInteraction(IActor reactor,IActor emitter,StringsignalName);}方法reactInteraction将被实现以实现该模式transmish-subscribe:用于注册reactor,以接收由actoremitter执行的名 为 signalName 的 信 号 的 调 用 - 即 reactor 将 观 察 emitter 的 动 作signalName。一个这样的法律骗局-紧张的互动空间,并限制了通知方法的行动者,54A. Natali等人理论计算机科学电子笔记154(2006)43- -一个确定的信号,并且只发送给reactInteraction中指示的参与者。实际上,reactInteraction也可以在框架中使用,以支持前一节中描述的有线模态。特别地,通过调用一组reactInteraction(O,E,S),我们固定了特定观察者的集合O可以观察到E发出的信号S。通过这样做,在配置时,内核(在reactInteraction中)可以在发射器Actor中注入支持,以便将信号直接发送到指定的观察者,而无需内核本身的调解。类似地,接口支持否决功能public interfacial { public void finds(IActor vetoer,IActor receiver,StringsignalName);}通过调用方法vetoInteraction,内核被配置为使actorvetoer可以否定地回复actor产生的输出信号signalName接收机这些定律只是内核可以实现的定律的一个子集:通过添加新的接口可以实现更多的定律。4基于逻辑的内核在开发我们的框架时,我们试验了内核的各种实现,提供了不同的方式来表示和管理基于不同类型的底层技术的交互。其中,我们发现逻辑编程范式非常有用。相应的内核,称为逻辑内核,采用一阶逻辑来描述和制定交互逻辑,包括单个参与者的交互能力,以及定义如何全局管理交互的协调定律。换句话说,内核将系统的配置(沉浸在环境中的参与者,他们的输入/输出交互信号集,以及控制交互的定律)和动态发生的交互事件作为逻辑理论来处理。然后,通过利用逻辑引擎(基于Prolog)实现该内核的中介和协调活动,根据交互定律和参与者配置正确处理发生的交互。4.1执行这个内核是按照“在空间中”的方式实现的,即作为一个运行时抽象,其中交互信号被具体化和适当管理。它通过类LogicKernel实现接口IKernel来实现A. Natali等人理论计算机科学电子笔记154(2006)4355- 即提供IKernel接口的组件。此外,它还实现了IContextLocal接口,该接口提供了加载,保存和执行逻辑理论的功能,并在运行时配置和修 改 内 核 。 这 个 类 的 实 现 基 于 我 们 开 发 的 tuProlog 开 源 项 目 [5](http://tuprolog.sourceforge.net)。 这是一个用Java 编写的轻量级Prolog引擎和API,它提供了Prolog和Java编程的平滑集成,允许从Java表示和调用Prolog目标,以及在Prolog理论中调用Java库。public interface IContextLocal {public alice.tuprolog.Prolog getPrologEngine();public void register(String term,Object obj);public boolean loadTheory(String absPath);public boolean saveTheory(String absPath);public String standardQuery(String queryS);public String queryS;public String getString();public int findDuplicate(int findDuplicate);}基本上,这个接口为tuProlog的API提供了一个包装器,方法来处理基本的Prolog原语,以加载和保存理论,执行查询和检索解决方案,等等。通过利用这些函数,LogicKernel必须实现IKernel接口提供的方法。支持配置的方法只是简单地导致一个包含参数信息的项(这里也称为元组)在知识库中被具体化,如下所示:该方法用于在内核中注册一个actor;调用由元组节点(NodeName,Class)表示。这个方法用于注册参与者有兴趣接收的输入信号;对于输入数组中指定的每个信号,调用由元组reacts(Reactor,Reacts Name)表示确认输出信号通知/确认/通知-这些三方法 是使用 到寄存器 的输出 通知/调用/通知信号一个演员可以收到;收到调用是repre-对于输入数 组 中 指 定 的 每 个 信 号 , 由 元 组 resNotify ( E , Name ) 、resNotifke(E,Name)或resInform(E,Name)然 后 这 些 元 组 实 际 上 被 看 作 是 Prolog 事 实 reacts/2 、 Prologrenotify/2、Prolog renotify/2、Prolog renotify/2和Node/2,在配置时动态地插入到基于知识的知识中除了配置详细信息外,交互的发生也是-56A. Natali等人理论计算机科学电子笔记154(2006)43补间参与者被动态地插入到知识库中。类LogicKernel中的方法跟踪在知识库中写入一个类型为out的项(Ecloud,Ecloud Name,Arg),其中Ecloud是负责交互的代理,Ecloud Name是信号名称,Arg是信号参数。当在内核上调用invoke、inform或notify方法时,会调用相应的prolog谓词invokeInTheSpace/4、informInTheSpace/3和notifyInTheSpace/3,它们负责允许适当的参与者感知信号,支持三个原语中每一个的精确语义谓词invokeInTheSpace/4的实现如下:invokeInTheSpace(EReactor,Reactor Name,Arg,Res):- reacts(Reactor,ReactorName),node(Reactor,Class),declares(Escherichia,Class Name),Reactor-doAction(Reactor Name,Cmd)返回Res,!.前三个参数和往常一样,最后一个参数是输出,提供调用结果。谓词按顺序(i)检索愿意接受信号的Reactor,(ii)检查它是否注册为节点,( iii ) 检 查 它 是 否 声 明 了 相 应 的 输 入 信 号 , 最 后 ( iv ) 调 用 方 法doAction,返回结果Res。注意,在tuProlog中,二进制in fix谓词<-用于调用右侧指定的方法,而左侧指定的引用标识了Java对象-可选的最终部分返回指定结果。如果这样的调用由于某种原因失败,谓词<-失败:对于Prolog的回溯语义,这会导致谓词做出反应,找到另一个解决方案,即另一个反应器。如果调用成功,则cut谓词!完成处决。最后,这保留了invoke原语的语义:内核将继续寻找一个(而且是精确的一个)成功执行所请求服务的参与者。谓词notifyInTheSpace/3的实现如下:notifyInTheSpace ( Reactor , Reactor Name ,Arg ) : - reacts ( Reactor , ReactorName),node(Reactor,Class),Reactor<-doAction ( ReactorName ,Arg)失败。notifyInTheSpace(Escort,Escort Name,Arg).A. Natali等人理论计算机科学电子笔记154(2006)4357与前一种情况不同的是,该谓词不提供应答,只是在任务结束时返回 当找到一个合适的参与者并调用其doAction方法时,元谓词失败会导致Prolog引擎回溯并通过谓词反应找到另一个参与者。 当不再存在这样的参与者时,第二个子句肯定地终止调用。请注意,如果doAction的某些调用失败,这根本不会干扰引擎的执行。这种行为保留了notify原语的语义:内核应该找到所有对通知感兴趣的参与者--发出通知的参与者对一些没有感知到通知的注册参与者不感兴趣。最后,谓词informInTheSpace/3的实现如下:informInTheSpace(Escheriche,EschericheName,Arg):-assert(proceed(Escheriche,Escheriche Name)),reacts(Reactor,Escheriche Name),proceed(Escheriche,EschericheName),node(Reactor,Class),Reactions Notify(Escheriche,Escheriche Name),retract(proceed(Escheriche,Escheriche Name)),Reactor<- doAction(EschericheName,Arg),assert(proceed(Escheriche,Escheriche Name)),fail.informInTheSpace(Escort,Escort Name,Arg):-proceed(Escort,Escort Name),retract(proceed(Escort,Escort Name)).这类似于谓词notifyInTheSpace。主要的区别是,一个事实proceed在开头的空格中被具体化,如果某个doAction失败,它就会被丢弃。当它被删除时,执行以否定方式终止,否则当所有参与者都被通知时,执行以肯定方式返回。此行为保留了inform原语的语义:内核应该找到所有对被通知感兴趣的参与者发出参与者对所有注册的参与者是否正确地感知到信号感兴趣。逻辑内核方法的一个主要优点是它允许轻松跟踪交互的发生及其管理,即应用程序的真实运行时行为。图4显示了框架的Inspector工具,用于显示关于逻辑内核的状态和演化的所有相关信息特别是,该工具可以检查当前的内核配置(按钮selfDescribe)、发生的交互并具体化为输出元组(按钮showInteractions)、控制交互定律的逻辑理论-即系统中的协调行为58A. Natali等人理论计算机科学电子笔记154(2006)43见图4。 检查器工具— (按钮显示理论)。Inspector工具可用于调试应用程序,并在运行时修改交互规则,查看和试验不同的系统演化。因此,逻辑内核通常用于原型和调试阶段:当交互逻辑被证明是正确的时,可以通过借助reactInteraction内核原语连接交互来获得系统的。特别是,在逻辑内核中,这样的原语使用Java事件侦听器模式连接发射器和观察者参与者。5一个简单的例子:乒乓系统为了给框架类和行为的解释,这里我们考虑一个非常简单的系统,称为乒乓,由两个组件组成,必须通过一个简单的规则来协调。图5给出了实现这个例子的Java类的源代码。组件由类PingActor和PongActor表示,在这里分别称为ping actor和pong actor。组件的行为非常简单:它们对接收到的特定输入信号做出反应(ping为ping actor,pong为pong actor),完成工作后(在我们的实现中只是休眠),它们发出特定的输出信号(pong为ping actor,ping为pong actor)。参与者共享相同的交互信号:一个参与者生成的信号触发另一个参与者执行服务。我们想要实现的简单协调规则解释了在N个阶段之后停止参与者之间的交互,即在N代乒乓信号之后。规则必须在不改变个体行为者行为的情况下具体化和执行。为此,我们A. Natali等人理论计算机科学电子笔记154(2006)4359public class PingActor extends AbstractActor{ public PingActor(String logo){super(logo);}public void doAction(String actionName,Object args)throws DoString Exception{ try{Thread.sleep(1000);kernel.notify(“ping”,“noArg”);} catch(Exception ex){ throw new Exception();}}public String[] getInputSignals(){ return new String[] {“pong”};}public String[] getOutputSignalsNotify(){ return new String[] {“ping”};}}public class String strategy { public String strategy(String strategy){super(logo);}public void doAction(String actionName,Object args)throws DoString Exception{ try{Thread.sleep(2000); kernel.notify(“pong”,“noArg”);} catch(Exception ex){ throw new Exception();}}public String[] getInputSignals(){return new String[]{“ping”};}public String[] getOutputSignalsNotify(){return new String[]{“pong”};}}public class Integer {int count;intmax;public void run(String s,String s){计数= 0;}public int findDuplicate(intfindDuplicate){count = 0;this.max = max;}public Object doAction(String actionName,Object args)throws DoString Exception{ return(count++ >= max);}public String[] getInputSignals(){ return new String[]{“pong”};}}}public class Test {publicstatic void main(String[] args){ kernel = new LogicKernel();ping= new PingActor(“pingActor”);ping.setKernel(kernel); //注入内核pong = newPongActor(“pongActor”);pong.setKernel(kernel); //注入内核veto= new VetoActor(“vetoActor”,3);veto.setKernel(kernel);//injection的内核int n = getInputSignals()[0];public String s(“String s”,“String s”);}}图五. Ping-Pong示例60A. Natali等人理论计算机科学电子笔记154(2006)43定义一个否决交互律,新的参与者作为通知给ping参与者的输入信号的否决者否决者本质上是计算ping信号通知给行动者的次数,只有当信号的数量小于N值时,否决者才同意将信号发送给ping行动者。最后,在主类中创建和配置系统的各个部分,包括内核、参与者和否决交互律,使vetoActor成为pingActor输入信号的否决者。生成ping信号以触发组件的活动6相关工作和结论在文献中可以找到几种用于组件规范和组件组合的模型和架构,无论是在协调模型和语言的上下文中[12,8]还是在软件架构的上下文中[6],包括ADL(架构描述语言)方法,如[9,7,10]。其中,两个最近和值得注意的例子分别是Reo [1]和Rainbow [3]。与这些方法不同的是,本文提出的框架以当前主流的基于组件的技术和
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 黑板风格计算机毕业答辩PPT模板下载
- CodeSandbox实现ListView快速创建指南
- Node.js脚本实现WXR文件到Postgres数据库帖子导入
- 清新简约创意三角毕业论文答辩PPT模板
- DISCORD-JS-CRUD:提升 Discord 机器人开发体验
- Node.js v4.3.2版本Linux ARM64平台运行时环境发布
- SQLight:C++11编写的轻量级MySQL客户端
- 计算机专业毕业论文答辩PPT模板
- Wireshark网络抓包工具的使用与数据包解析
- Wild Match Map: JavaScript中实现通配符映射与事件绑定
- 毕业答辩利器:蝶恋花毕业设计PPT模板
- Node.js深度解析:高性能Web服务器与实时应用构建
- 掌握深度图技术:游戏开发中的绚丽应用案例
- Dart语言的HTTP扩展包功能详解
- MoonMaker: 投资组合加固神器,助力$GME投资者登月
- 计算机毕业设计答辩PPT模板下载
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功