<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 Net的Notation,定义语言也是采用WFNet PNML(WFNet是其的Net Type)。
其可以采用PNK进行模型定义,但是需要使用WFNet的PNK支持配置文件,这个Bossa提供了,但是很遗憾的是,总是造成PNK的错误,可能与文件格式和编码有关系,这个后来因为时间问题,没有继续查找具体原因。<o:p></o:p>
<o:p> </o:p>
Bossa的帮助文档非常匮乏,即使其网站上提供的how to和api文档,也仅仅只是泛泛介绍。甚至没有一个如何正确运行其所提供了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 包中。
包括:CaseType,Case,Place,Transition,Edge,Activity,Workitem
<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 | 代表了一个Transtion的firing。 This class represents a transition of a specific case instance。a 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>
Bossa的token解决
Petri Net允许从一个place到transition有几个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>
Bossa的Resouce
在Bossa中,Resouce是Task(Transition)的执行者,但是其不是简单的实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>
Bossa的Workitem
注意,我们通常所理解的workitem概念,在Bossa中是不一样的。
在一个CaseType,如果存在多少个Transition,则在一个Case实例中,则存在多少个Workitem。其workitem表示的代表一个transition的firable状态。
<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列表,只是其中一些workitem是fireable的,一些不是。
每一次close activity之后,会更改workitem的firable状态(主要是调用其update方法)。
<o:p> </o:p>
Bossa的Event和Queqe
com.bigbross.bossa.notify 包提供了一种事件监听、通知的机制。
Listener
Event
NotificationBus 就是一个support类。
NotificationQueue 表示的是一个“处理队列”类,提供记录了一些需要处理的Event可能。
<o:p> </o:p>
WFNetEvents (extends NotificationQueue)则记录了所有有关 WFNet的event事件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工作流引擎通过Petri网模型为开发者提供了一种强大而灵活的工具,用于构建和管理复杂的业务流程。它的核心在于并发控制和流程控制的精确性,同时具有良好的可扩展性和集成能力。理解并掌握BossA的原理和...
Bossa Workflow 是一个基于Petri网的工作流引擎,源自sourceforge.net,它提供了一种高效且灵活的方式来管理和执行工作流程。本文将深入探讨Boss Workflow的核心概念、特点以及如何使用它来构建和执行工作流程。 ##...
小型高精度雷达,用于高精度的小型信号测量,配置烧录软件,bossa 是光网给出的软件,分享给大家使用,下载比较困难,借助于CSDN进行传播。
bossa引擎是一款开源的轻量级的工作流引擎,他是基于petri net的,不需要后台数据库系统的支持,他通过叫prevaler的系统来维护自身的持久化,所谓prevaler系统是基于sun的Serializable接口的。
总结,Bossa Workflow是一款值得考虑的工作流引擎,尤其适合那些希望在Java应用中实现灵活、高效工作流程管理的开发者。通过Petri网的使用和无需RDBMS的特性,Bossa为业务流程的设计和执行提供了一种创新且实用的...
BOSSA的动机是创建一个简单,易于使用的开源实用程序来替代Atmel的SAM-BA软件。 BOSSA是基本开源SAM-BA应用程序的首字母缩写,以反映该目标。 该软件是由Scott Shumate创建的,并有几个。 该软件是根据LICENSE...
BOSSA的动机是创建一个简单,易于使用的开源实用程序来替代Atmel的SAM-BA软件。 该项目是一个分支,旨在临时托管对BOSSA的新修改,直到可以将其合并到主要BOSSA代码库中为止。 有关原始项目的更多信息:BOSSA网站:...
该项目移至GitHub:https://github.com/shumatech/BOSSA
Stan Getz Bossanova谱子,包含大师最经典bossanova风格曲目,以及solo。
Jlink V8.0 固件维修 用于win10上对Jlink V8.0进行修复 博客中有相关教程:https://blog.csdn.net/CSDN_JZ_/article/details/90484942
Bossa-box挑战 VUTTR前端应用 该存储库包含由bossa-box提出的挑战的解决方案。 要求: NodeJS v5.2.0 + 怎么跑 克隆/下载此存储库。 进入api文件夹并运行yarn install和node server.js 。 该API位于...
外科手术模拟器Surgeon Simulator是一款奇特的模拟游戏,作为外科医生亲自为病人做移植、摘除等手术,可以用的工具相当丰富,称为武器也不为过。 数据包(sd/Android/obb/com.bossastudios.ss13touch):点这儿
样本组合该存储库包含我多年来在Bossa Nova Data Solutions工作的样本。 它包含一些用于我们的AI驱动的质量保证平台Caperio.AI的微服务脚本。 它还包括我们多年来在信用风险管理行业中所做的一些项目,用于开发各种...
Bossa下载器 使用保存日内数据。 一个简单的用于日间交易的GUI。 入门 下载并解压缩。 将nolclientapi.dll放入Windows \ SysWOW64文件夹(对于32位版本的Windows,则为Windows \ System32)。 下载资源库并使用...
波萨诺瓦 共享吉他和弦的巧妙方法。 和弦,五线谱,cifras 开源的 容易更新 ## use your favorite text editor. Sublime Text or Atom will highlight python syntaxe from this markdown text snippet. ...
10. Arduino UNO REV3.inf:Arduino UNO是最常用的开发板之一,基于ATmega328P微控制器。这个驱动文件用于在Windows系统中安装UNO的USB驱动,使得用户可以通过USB线直接将代码上传到开发板。 综上所述,这些驱动...
能直接解决win7下, arduino due装上无法使用问题,实测有效。我用due半天不出串口号,最后解决了。这个包同样能解决其它开发版无法显示串口设备的问题。包含usber.sys ,arduino due.sys等
6. Bossa,作为一个标准的Petri网引擎,可能直接将流程定义为Petri网模型,利用Petri网的数学理论进行流程分析和优化。它的调度算法会基于令牌转移,确保流程的正确执行和资源的有效利用。 理解Petri网是理解这些...