`
ww2
  • 浏览: 418199 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Bossa研究总结(之一)

阅读更多

<o:p> </o:p>

Bossa研究总结<o:p></o:p>

<o:p> </o:p>

胡长城(银狐999)

<st1:chsdate month="10" islunardate="False" day="10" year="2004" w:st="on" isrocdate="False">2004-10-10</st1:chsdate>

<o:p> </o:p>

Bossa主站点:http://www.bigbross.com/bossa/

      

       Bossa与其说是一个workflow engine,不如说是一个Petri Net Engine。其完全采用Petri NetNotation,定义语言也是采用WFNet PNMLWFNet是其的Net Type)。

       其可以采用PNK进行模型定义,但是需要使用WFNetPNK支持配置文件,这个Bossa提供了,但是很遗憾的是,总是造成PNK的错误,可能与文件格式和编码有关系,这个后来因为时间问题,没有继续查找具体原因<o:p></o:p>

<o:p> </o:p>

       Bossa的帮助文档非常匮乏,即使其网站上提供的how toapi文档,也仅仅只是泛泛介绍。甚至没有一个如何正确运行其所提供了example的说明。<o:p></o:p>

<o:p> </o:p>

       Bossa支持的是Color Petri Net。这一点是由Case对象的attribute属性体现<o:p></o:p>

<o:p> </o:p>

Bossa的基本对象元素:

       这些主要对象元素,放在 com.bigbross.bossa.wfnet 包中。

       包括:CaseTypeCasePlaceTransitionEdgeActivityWorkitem

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

CaseType

流程定义对象

Case

流程的实例

Place

对应于Petri Net中的元素 place

Transition

对应于Petri Net中的元素 transition

Edge

对应于Petri NetArc(有向弧)

Workitem

代表了一个Transtionfiring

This class represents a transition of a specific case instancea work item is a likely fireable transition

Activity

当打开一个workitem的时候就获取一个Activiy对象

This class represents an open (firing) work item<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

Bossatoken解决

       Petri Net允许从一个placetransition有几个arc,来表示允许几个token

       Bossa为了解决这个问题,引入了weight这个方式。而且允许这个weight是一个javascripte计算表达式(运行期间,解析表达式,返回的值就是token的个数)。

       但注意,weight本身并不是以属性存在于这些对象中,而是以方法。

<o:p> </o:p>

        List edges = activity.getTransition().getOutputEdges();<o:p></o:p>

        for (Iterator i = edges.iterator(); i.hasNext(); ) {<o:p></o:p>

            Edge e = (Edge) i.next();<o:p></o:p>

            /* An EvaluationException can be inconsistently thrown here. */<o:p></o:p>

            int tokenNumber = e.output(this);<o:p></o:p>

            this.marking[e.getPlace().getIndex()] += tokenNumber;<o:p></o:p>

            eventQueue.newPlaceEvent(getBossa(), WFNetEvents.ID_ADD_TOKENS,<o:p></o:p>

                                     this, e.getPlace(), tokenNumber);<o:p></o:p>

        }<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

BossaResouce

       Bossa中,ResouceTaskTransition)的执行者,但是其不是简单的实user的集合,在定义的时候,其表示的是一个“表达式”,而运行中,才会转换为相应得user list

       比如“sales - $a”,代表的就是,这个Task的执行者是“sales用户组中的用户 减去 a任务(Task,Transition)的执行者”。<o:p></o:p>

       注意,这个“表达式”,不是script的了,而是bossa自己的规则表达式。

<o:p> </o:p>

       但是,具体这个Resouce如何解析、运行。并没有深入

<o:p> </o:p>

Bossa的引擎

       Bossa的引擎类com.bigbross.bossa.Bossa.

       其是通过BossaFactory创建的

<o:p> </o:p>

BossaWorkitem

       注意,我们通常所理解的workitem概念,在Bossa中是不一样的。

       在一个CaseType,如果存在多少个Transition,则在一个Case实例中,则存在多少个Workitem。其workitem表示的代表一个transitionfirable状态。

<o:p> </o:p>

Collection ts = caseType.getTransitions();<o:p></o:p>

workItems = new HashMap(ts.size());<o:p></o:p>

for (i = ts.iterator(); i.hasNext(); ) {<o:p></o:p>

Transition t = (Transition) i.next();<o:p></o:p>

workItems.put(t.getId(), new WorkItem(this, t, isFireable(t)));<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

       这个是在Case实例初始化的时候构造workitems列表,只是其中一些workitemfireable的,一些不是。

       每一次close activity之后,会更改workitemfirable状态(主要是调用其update方法)。    

<o:p> </o:p>

BossaEventQueqe

       com.bigbross.bossa.notify 包提供了一种事件监听、通知的机制。

      

       Listener

       Event

       NotificationBus 就是一个support类。

       NotificationQueue 表示的是一个“处理队列”类,提供记录了一些需要处理的Event可能。

<o:p> </o:p>

WFNetEvents extends NotificationQueue)则记录了所有有关 WFNetevent事件ID,以及调用这些事件的方法。每调用一个时间处理方法,如下所示

<o:p> </o:p>

    void newCaseEvent(Bossa bossa, String notificationId, Case caze) {<o:p></o:p>

        if (bossa != null) {<o:p></o:p>

            Map attrib = new HashMap();<o:p></o:p>

            attrib.put(ATTRIB_CASE_ID, Integer.toString(caze.getId()));<o:p></o:p>

            attrib.put(ATTRIB_CASE_TYPE_ID, caze.getCaseType().getId());<o:p></o:p>

            addEvent(new Event(notificationId, Event.WFNET_EVENT, attrib,<o:p></o:p>

                               bossa.getTimeSource().getTime()));<o:p></o:p>

        }<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

可以看出来,其是将一个event注入到NotificationQueue 所提供的queue列表中。

<o:p> </o:p>

那么是如何执行的呢?

        WFNetEvents queue = new WFNetEvents();<o:p></o:p>

        queue.newCaseEvent(getBossa(), WFNetEvents.ID_OPEN_CASE, caze);<o:p></o:p>

        queue.notifyAll(getBossa());<o:p></o:p>

<o:p> </o:p>

其最后调用notifyAll方法,来进行处理。

    public void notifyAll(Bossa bossa) {<o:p></o:p>

        if (bossa != null) {<o:p></o:p>

            NotificationBus bus = bossa.getNotificationBus();<o:p></o:p>

            for (Iterator i = queue.iterator(); i.hasNext(); ){<o:p></o:p>

                Event e = (Event) i.next();<o:p></o:p>

                bus.notifyEvent(e);<o:p></o:p>

                i.remove();         }        }    }<o:p></o:p>

<o:p> </o:p>

到这一步,就可以很清晰的明白了吧:

       整个内部还是一个“事件监听”,但是在这个事件监听外围,封装了一层“事件处理队列”。

<o:p> </o:p>

分享到:
评论

相关推荐

    bossa工作流引擎

    总结,BossA工作流引擎通过Petri网模型为开发者提供了一种强大而灵活的工具,用于构建和管理复杂的业务流程。它的核心在于并发控制和流程控制的精确性,同时具有良好的可扩展性和集成能力。理解并掌握BossA的原理和...

    Bossa Workflow

    Bossa Workflow 是一个基于Petri网的工作流引擎,源自sourceforge.net,它提供了一种高效且灵活的方式来管理和执行工作流程。本文将深入探讨Boss Workflow的核心概念、特点以及如何使用它来构建和执行工作流程。 ##...

    bossa-x64-1.9.1.msi

    小型高精度雷达,用于高精度的小型信号测量,配置烧录软件,bossa 是光网给出的软件,分享给大家使用,下载比较困难,借助于CSDN进行传播。

    Bossa-Workflow-System.rar_bossa_bossa workflow_workflow

    bossa引擎是一款开源的轻量级的工作流引擎,他是基于petri net的,不需要后台数据库系统的支持,他通过叫prevaler的系统来维护自身的持久化,所谓prevaler系统是基于sun的Serializable接口的。

    Bossa Workflow-开源

    总结,Bossa Workflow是一款值得考虑的工作流引擎,尤其适合那些希望在Java应用中实现灵活、高效工作流程管理的开发者。通过Petri网的使用和无需RDBMS的特性,Bossa为业务流程的设计和执行提供了一种创新且实用的...

    BOSSA:BOSSA是用于Atmel的基于闪存的ARM微控制器的SAM系列的闪存编程实用程序。 BOSSA的动机是创建一个简单,易于使用的开源实用程序来替代Atmel的SAM-BA软件。 BOSSA是基本开源SAM-BA应用程序的首字母缩写,以反映该目标

    BOSSA的动机是创建一个简单,易于使用的开源实用程序来替代Atmel的SAM-BA软件。 BOSSA是基本开源SAM-BA应用程序的首字母缩写,以反映该目标。 该软件是由Scott Shumate创建的,并有几个。 该软件是根据LICENSE...

    A fork of BOSSA:这是ShumaTech的BOSSA项目的一个分支。-开源

    BOSSA的动机是创建一个简单,易于使用的开源实用程序来替代Atmel的SAM-BA软件。 该项目是一个分支,旨在临时托管对BOSSA的新修改,直到可以将其合并到主要BOSSA代码库中为止。 有关原始项目的更多信息:BOSSA网站:...

    BOSSA-开源

    该项目移至GitHub:https://github.com/shumatech/BOSSA

    216820327-Stan-Getz-Bossa-Nova-Tenor-Sax.pdf

    Stan Getz Bossanova谱子,包含大师最经典bossanova风格曲目,以及solo。

    JlinkV8.0维修.zip

    Jlink V8.0 固件维修 用于win10上对Jlink V8.0进行修复 博客中有相关教程:https://blog.csdn.net/CSDN_JZ_/article/details/90484942

    desafio-bossa-box

    Bossa-box挑战 VUTTR前端应用 该存储库包含由bossa-box提出的挑战的解决方案。 要求: NodeJS v5.2.0 + 怎么跑 克隆/下载此存储库。 进入api文件夹并运行yarn install和node server.js 。 该API位于...

    外科手术模拟器.Surgeon-Simulator-1.0.0

    外科手术模拟器Surgeon Simulator是一款奇特的模拟游戏,作为外科医生亲自为病人做移植、摘除等手术,可以用的工具相当丰富,称为武器也不为过。 数据包(sd/Android/obb/com.bossastudios.ss13touch):点这儿

    sample-portfolio:该存储库包含我多年来在Bossa Nova Data Solutions工作的样本

    样本组合该存储库包含我多年来在Bossa Nova Data Solutions工作的样本。 它包含一些用于我们的AI驱动的质量保证平台Caperio.AI的微服务脚本。 它还包括我们多年来在信用风险管理行业中所做的一些项目,用于开发各种...

    BossaDownloader:使用Bossa API(NOL3的简单替代GUI)下载日内数据

    Bossa下载器 使用保存日内数据。 一个简单的用于日间交易的GUI。 入门 下载并解压缩。 将nolclientapi.dll放入Windows \ SysWOW64文件夹(对于32位版本的Windows,则为Windows \ System32)。 下载资源库并使用...

    bossa-nova:人物,吉他谱

    波萨诺瓦 共享吉他和弦的巧妙方法。 和弦,五线谱,cifras 开源的 容易更新 ## use your favorite text editor. Sublime Text or Atom will highlight python syntaxe from this markdown text snippet. ...

    arduino驱动

    10. Arduino UNO REV3.inf:Arduino UNO是最常用的开发板之一,基于ATmega328P微控制器。这个驱动文件用于在Windows系统中安装UNO的USB驱动,使得用户可以通过USB线直接将代码上传到开发板。 综上所述,这些驱动...

    arduino due终级驱动

    能直接解决win7下, arduino due装上无法使用问题,实测有效。我用due半天不出串口号,最后解决了。这个包同样能解决其它开发版无法显示串口设备的问题。包含usber.sys ,arduino due.sys等

    工作流引擎核心调度算法.docx

    6. Bossa,作为一个标准的Petri网引擎,可能直接将流程定义为Petri网模型,利用Petri网的数学理论进行流程分析和优化。它的调度算法会基于令牌转移,确保流程的正确执行和资源的有效利用。 理解Petri网是理解这些...

Global site tag (gtag.js) - Google Analytics