工作流学习(二)

Osworkflow 简介

概念

Ø           在商用和开源世界里, OSWorkflow  都不同于这些已有的工作流系统。最大不同在于  OSWorkflow  有着非常优秀的灵活性。在开始接触  OSWorkflow  时可能较难掌握(有人说不适合工作流新手入门),比如, OSWorkflow  不要求图形化工具来开发工作流,而推荐手工编写  xml  格式的工作流程描述符。它能为应用程序开发者提供集成,也能与现有的代码 和数据库进行集成。这一切似乎给正在寻找快速 即插即用 工作流解决方案的人制造了麻烦,但研究发现,那些 即插即用 方案也不能在一个成熟的应用程序中 提供足够的灵活性来实现所有需求。

比较

Ø         OSWorkflow  给你绝对的灵活性。 OSWorkflow  被认为是一种 低级别 工作流实现。与其他工作流系统能用图标表现 “Loops( 回路 )” “Conditions( 条件 )” 比, OSWorkflow  只是手工 编码 (Coded)” 来实现的。但这并不能说实际的代码是需要完全手工编码的,脚本语言能胜任这种情形。 OSWorkflow  不希望一个非技术用户修改工作流程,虽然一些其他工作流系统提供了简单的  GUI  用于工作流编辑,但像这样改变工作流,通常会破 坏这些应用。所以,进行工作流调整的最佳人选是开发人员,他们知道该怎么改变。不过,在最新的版本中, OSWorkflow  也提供了  GUI  设计器来 协助工作流的编辑。 OSWorkflow  基于有限状态机概念。每个  state   step ID   status  联合表现(可 简单理解为  step  及其  status  表示有限状态机的  state )。一个  state  到另一  state   transition  依赖于  action  的发生,在工作流生命期内有至少一个或多个活动的  state 。这些简单概念展现了  OSWorkflow  引擎的核心思想,并允许一个 简单  XML  文件解释工作流业务流程。

 

 

Osworkflow 流程定义

基本概念

步骤

Ø           一个  Step  描述的是工作流所处的位置。可能从一个  Step Transtion (流转)到另外一个  Step ,或者也可以在同一个  Step  内流转(因为  Step  可以通  Status  来细分,形成多个 State )。一个流程里面可以多个 Step

状态

Ø         工作流  Status  是用来描述工作流程中具体 Step (步骤)状态的字符串。 OSWorkflow  的有  Underway (进行中)、 Queued (等候处理中)、 Finished (完成)三种  Status 。一个实际 State (状态)真正是由两部分组成: State = (Step +  Status) 

流转

Ø           一个 State 到另一个 State 的转移。

动作

Ø         Action  触发了发生在  Step  内或  Step  间的流转,或者说是基于  State  的流转。一个  step  里面可以有多个 Action Action  Step  之间的关系是, Step  说明 在哪里 Action  说明 去哪里   一个  Action  典型地由两部分组成:可以执行此 Action (动作)的
Condition
(条件),以及执行此动作后的  Result (结果)。     

条件

Ø         类似于逻辑判断,可包含 “AND” “OR” 逻辑。比如一个请假流程中的 本部门审批阶段 ,该阶段利用 “AND” 逻辑,判断流程状态是否为等候处理中,以及审批者是否为本部门主管。

结果

Ø         Result  代表执行 Action (动作)后的结果,指向新的  Step  及其  Step Status ,也可能进入  Split  或者  Join Result  为两种,  Contidional-Result  (有条件结果),只有条件为真时才使用该结果,和  Unconditional-Result (无条件 结果),当条件不满足或没有条件时使用该结果。

分离 / 连接

Ø         流程的切分和融合。很简单的概念, Split  可以提供多个  Result (结果); Join  则判断多个  Current Step  的态提供一个  Result (结果)。

 

描述

步骤、状态和动作 (Step, Status, and Action)

Ø         工作流要描述步骤 (Step) 、步骤的状态 (Status) 、各个步骤之间的关系以及执行各个步骤的条件和权限,每个步骤中可以含有一个或多个动作 (Action) ,动作将会使一个步骤的状态发生改变。对 于一个执行的工作流来讲,步骤的切换是不可避免的。一个工作流在某一时刻会有一个或多个当前步骤,每个当前步骤都有一个状态值,当前步骤的状态值组成了工 作流实例的状态值。一旦完成了一个步骤,那么这个步骤将不再是当前步骤(而是切换到一个新的步骤),通常一个新的当前步骤将随之建立起来,以保证工作流继 续执行。完成了的步骤的最终状态值是用 Old-Status 属性指定的,这个状态值的设定将发生在切换到其他步骤之前。 Old-Status 的值可以是任 意的,但在一般情况下,我们设置为 Finished 。切换本身是一个动作( Action )的执行结果。每个步骤可以含有多个动作,究竟要 载入哪个动作是由最终用户、外部事件或者 Tiggerd 的自动调用决定的。随着动作的完成,一个特定的步骤切换也将发生。动作可以被限制在用户、用户组或 当前状态。每一个动作都必须包含一个 Unconditional Result 0 个或多个 Conditional Results 。所 以,总体来说,一个工作流由多个步骤组成。每个步骤有一个当前状态(例如: Queued, Underway or Finished ),一个步骤包含多 个动作。每个步骤含有多个可以执行的动作。每个动作都有执行的条件,也有要执行的函数。动作包含有可以改变状态和当前工作流步骤的 results

  结果、分支和连接 (Results, Joins, and Splits)

Ø         无条件结果 (Unconditional Result)
对于每一个动作来讲,必须存在一个 Unconditional Result 。一个 result 是一系列指令,这些指令将告诉 OSWorkFlow 下一个任务要做什么。这包括使工作流从一个状态切换到另一个状态。

Ø         有条件结果 (Conditional Result)
Conditional Result
Unconditional Result 的一个扩展。它需要一个或多个 Condition 子标签。第一个为 true Conditional (使用 AND OR 类型),会指明发生切换的步骤,这个切换步骤的发生是由于某个用户执行了某个动作的结果导致的。

Ø         三种不同的 Results(conditional or unconditional) 一个新的、单一的步骤和状态的组合。一个分裂成两个或多个步骤和状态的组合。将这个和其他的切换组合成一个新的单一的步骤和状态的组合。每种不同的 result 对应了不同的 xml 描述,注意:通常,一个 split 或一个 join 不会再导致一个 split   join 的发生。

  自动步骤 (Auto actions)

Ø         的时候,我们需要一些动作可以基于一些条件自动地执行。为了达到这个目的,你可以在 action 中加入 auto="true" 属性。流程将考察这个动作的 条件和限制,如果条件符合,那么将执行这个动作。  Auto action 是由当前的调用者执行的,所以将对该动作的调用者执行权限检查。

整合抽象实例 (Integrating with Abstract Entities)

Ø         议在你的核心实体中,例如 "Document"   "Order" ,在内部创建一个新的属性: workflowId 。这样,当新的 "Document"   "Order" 被创建的时候,它能够和一个 workflow 实例关联起来。那么,你的代码可以通过 OSWorkflow API 查找到这个 workflow 实例并且得到这个 workflow 的信息和动作。

工作流实例状态 (Workflow Instance State)

Ø         的时候,为整个 workflow 实例指定一个状态是很有帮助的,它独立于流程的执行步骤。 OSWorkflow 提供一些 workflow 实例中可以包含的 "meta-states" 。这些 "meta-states" 可以是 CREATED, ACTIVATED, SUSPENDED, KILLED   COMPLETED 。当一个工作流实例被创建的时候,它将处于 CREATED 状态。然后,只要一个动作被执行,它就会自动的变成 ACTIVATED 态。如果调用者没有明确地改变实例的状态,工作流将一直保持这个状态直到工作流结束。当工作流不可能再执行任何其他的动作的时候,工作流将自动的变成 COMPLETED 状态。然而,当工作流处于 ACTIVATED 状态的时候,调用者可以终止或挂起这个工作流(设置工作流的状态为 KILLED   SUSPENDED )。一个终止了的工作流将不能再执行任何动作,而且将永远保持着终止状态。一个被挂起了的工作流会被冻结,他也不能 执行任何的动作,除非它的状态再变成 ACTIVATED

 

Osworkflow

 OS_WFENTRY

工作流主表,存放工作流名称和状态

字段名         

数据类型

说明

ID    

NUMBER    

  自动编号

NAME    

VARCHAR2(20)    

工作流名称

STATE    

NUMBER    

工作流状态

 

OS_CURRENTSTEP

当前步骤表,存放当前正在进行步骤的数据

字段名         

数据类型

说明

ID    

 NUMBER 

  自动编号

ENTRY_ID   

 NUMBER    

    工作流编号

STEP_ID    

  NUMBER   

   步骤编号

ACTION_ID   

 NUMBER    

  动作编号

OWNER    

 VARCHAR2(20)    

步骤的所有者

START_DATE    

 DATE   

  开始时间

FINISH_DATE    

DATE    

     结束时间

DUE_DATE    

  DATE    

授权时间

STATUS    

VARCHAR2(20)   

   状态

CALLER    

VARCHAR2(20) 

  操作人员的帐号名称

 

OS_CURRENTSTEP_PREV

前步骤表,存放当前步骤和上一个步骤的关联数据

字段名         

数据类型

说明

ID   

 NUMBER   

当前步骤编号

PREVIOUS    

 NUMBER   

前步骤编号

 

 

 

 

OS_HISTORYSTEP

历史步骤表,存放当前正在进行步骤的数据

字段名         

数据类型

说明

ID    

 NUMBER 

  自动编号

ENTRY_ID   

 NUMBER    

    工作流编号

STEP_ID    

  NUMBER   

   步骤编号

ACTION_ID   

 NUMBER    

  动作编号

OWNER    

 VARCHAR2(20)    

步骤的所有者

START_DATE    

 DATE   

  开始时间

FINISH_DATE    

DATE    

     结束时间

DUE_DATE    

  DATE    

授权时间

STATUS    

VARCHAR2(20)   

   状态

CALLER    

VARCHAR2(20) 

  操作人员的帐号名称

 

 

 

 

OS_HISTORYSTEP_PREV

前历史步骤表,存放历史步骤和上一个步骤的关联数据

字段名         

数据类型

说明

ID   

 NUMBER   

当前步骤编号

PREVIOUS    

 NUMBER   

前步骤编号

 

 

 

 

OS_PROPERTYENTRY

属性表,存放临时变量

字段名         

数据类型

说明

GLOBAL_KEY   

VARCHAR2(255)    

     全局关键字

ITEM_KEY   

 VARCHAR2(255)    

    条目关键字

ITEM_TYPE    

 NUMBER   

     条目类型

STRING_VALUE    

 VARCHAR2(255)    

   字符值

DATE_VALUE    

  DATE    

     日期值

DATA_VALUE    

   BLOB    

    数据值

FLOAT_VALUE   

  FLOAT   

    浮点值

NUMBER_VALUE    

  NUMBER    

    数字值

 

Os_entryids

 

字段名         

数据类型

说明

id

bigint

编号

 

 

 

 

 

 

 

 

Os_stepids

 

字段名         

数据类型

说明

username

 

 

passwordhash

 

 

 

 

 

 

 

Os_group

 

字段名         

数据类型

说明

groupname

 

 

 

 

 

 

 

 

 

 

Os_membership

 

字段名         

数据类型

说明

Username

 

 

groupname

 

 

 

 

 

 

 

 

 

字段名         

数据类型

说明

 

 

 

 

 

 

 

 

 

 

Osworkflow 程序包

 com.opensymphony.workflow

Ø         该包为整个 OSWorkflow  引擎提供核心接口。例如  com.opensymphony.workflow.Workflow  接口,可以说,实际开 发中的大部分工作都是围绕该接口展开的,该接口有  BasicWorkflow EJBWorkflow OfbizWorkflow  三个实现类。

 com.opensymphony.workflow.basic

Ø         该包有两个类, BasicWorkflow   BasicWorkflowContext BasicWorkflow  不支持事务,尽管依赖持久实现,事务也不能包裹它。 BasicWorkflowContext  在实际开发中很少使用。 public void setWorkflow(int userId) {
    Workflow workflow = new BasicWorkflow(Integer.toString(userId));
}

 

 com.opensymphony.workflow.config

Ø         包有一个接口和两个该接口的实现类。在  OSWorkflow 2.7  以前,状态由多个地方的静态字段维护,这种方式很方便,但是有很多缺陷和约束。最 主要的缺点是无法通过不同配置运行多个  OSWorkflow  实例。实现类  DefaultConfiguration  用于一般的配置文件载入。而  SpringConfiguration  则是让  Spring  容器管理配置信息。 public void setWorkflow(int userId) {
    Workflow workflow = new BasicWorkflow(Integer.toString(userId));
}

 

 com.opensymphony.workflow.ejb

Ø         该包有两个接口  WorkflowHome   WorkflowRemote 。该包的若干类中,最重要的是  EJBWorkflow ,该类和  BasicWorkflow  的作用一样,是  OSWorkflow  的核心,并利用  EJB  容器管理事务,也作为工作流  session bean  的包装器。

 

com.opensymphony.workflow.loader

Ø         该包有若干类,用得最多的是  XxxxDescriptor ,如果在工作流引擎运行时需要了解指定的动作、步骤的状态、名字,等信息时,这些描述符会起到很大作用。 public String findNameByStepId(int stepId,String wfName) {
    WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName);
    StepDescriptor stepDes = wd.getStep(stepId);
    return stepDes.getName();
}

 

com.opensymphony.workflow.ofbiz

Ø         OfbizWorkflow   BasicWorkflow  在很多方面非常相似,除了需要调用  ofbiz   TransactionUtil  来包装事务。

 

com.opensymphony.workflow.query

Ø         包主要为查询而设计,但不是所有的工作流存储都支持查询。通常, Hibernate   JDBC  都支持,而内存工作流存储不支持。值得注意的是  Hibernate  存储不支持混合型查询(例如,一个查询同时包含了  history step  上下文和  current step  上下文)。执 行一个查询,需要创建  WorkflowExpressionQuery  实例,接着调用  Workflow  对象的  query  方法来得到最终查询结 果。

com.opensymphony.workflow.soap

Ø         OSWorkflow  通过  SOAP  来支持远端调用。这种调用借助  WebMethods  实现。

 

 com.opensymphony.workflow.spi

Ø         该包可以说是  OSWorkflow  与持久层打交道的途径,如当前工作流的实体,其中包括: EJB Hibernate JDBC Memory Ofbiz OJB Prevayler

HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate()
    .find("from HibernateWorkflowEntry where Id="
        + wfIdList.get(i)).get(0);

com.opensymphony.workflow.util

Ø         该包是  OSWorkflow  的工具包,包括了对  BeanShell BSF EJB Local EJB Remote JNDI  的支持。

 

Basic

Basicworkflow: 未实现事务回滚

Basicworkflowcontext: 上下文对象的 basic 实现方式

Config

读取 xml 配置文件的一些常用类

Ejb

Workflow ejb 实现方式,主要对象是 ejbworkflow ejbworkflowcontext

loader

在工作流初始化时必须要加载的一些类。主要有 workflowfactory 接口 xmlworkflowfactory 实现类,还有 workflowdescriptor 等描述 xml 配置文件的实体对象

Ofbiz

Workflow ofbiz 实现方式,只有两个对象分别是 ofbizworkflow ofbizworkflowcontext

Query

查询分析器,完成单一、嵌套、组合查询,主要对象 workflowExpressionquery

Soap

Soap 实现方式

Spi

与后台打交道的关于 workflow 存储的一些类或者对象有 workflowentry 接口,此接口返回一个工作流实例对象; workflowstore 里面定义的全部都是工作流的存储和查询方法;

JDBCworkflowstore 实现 simpleworkflowentry

Hibernate 或者 spring+hibernate 实现 hibernateworkflowentry

Step 接口被 simplestep 或者 hibernatestep 调用;

Simplestep jdbcworkflowstep 实现方式;

Hibernatestep hibernateworkflowstore 或者 springhibernate rkflow 实现方式

Spi.ejb

Ejb 方式存储

Spi.hibernate

Hibernate2 或者 spring+hibernate2 形势存储实现方式

Spi.hibernate3

Hibernate3 或者 spring+hibernate3 形势存储实现方式,目前主流方式

Spi.jdbc

Jdbc 存储方式,常见且经典方式

Spi.memory

Memory 存储方式

Spi.ofbiz

Ofbiz 形势存储方式

Spi.ojb

Obj 存储方式

Spi.prevayler

Prevayler 存储方式

Timer

定时器,用来处理定时任务

util

扩展,实现支持 jndi jmail springframework log4j osuer

Util.beanshell

Beanshell 形势的 condition function registor validator 实现方式

Util.bsf

Bsf 形势的 condition function registor validator 实现方式

Util.ejb

Ejb 形势的 condition function registor validator 实现方式

Util.jndi

Jndi 形势的 condition function registor validator 实现方式

 

Osworkflow 方法接口

Workflow initialize doAction ,还有 wf GetAvailableActions(id,map) 方法都有一个 hashmap 类型参数,是用来传递工作流中所需的数据或者对象,其有效范围只包括当前步骤或者下一步。可应用在 function,condition,validator 等当中

 

Workflow 主要方法

getAvailableActions(id,null)

得到当前工作流实例所有有效动作

ID :工作流实例 ID

要传递的对象

getCurrentSteps(id)

得到当前步骤

getEntryState(id)

得到当前状态

getHistorySteps(id)

得到历史步骤

getPropertySet(id)

得到 PropertySet 对象

getSecurityPermissions(id)

得到状态权限列表

getWorkflowDescriptor(id)

得到工作流 XML 描述文件对象

getWorkflowName(id)

得到当前实例名称

getWorkflowNames()

得到工作流名称

 

 

 

Workflow 接口中的核心方法

Ø         得到 workflowstore 实现类,利用里面的 createEntry 方法创建一个 workflowentry 对象

Ø         执行 populateTransientMap 方法,将 context workflowcontext ), entry workflowentry ), strore workflowstore ), configuration configuration ), descriptor workflowDescriptor )装进 transientvars ;将当前要执行的 actionid currentsteps 装进 transientvars ;将所有 XML 中配置的 register 装进 transientvars

Ø         根据 restrict-to 里配置的条件来判断是否能初始化工作流,如果不能则回滚并抛出异常

Ø         执行 transitionworkflow 方法传递工作流,这个 transitionworkflow 方法是 workflow 中重要方法

Ø         返回当前工作流程实例 ID

 

Transition workflow 方法

是工作流最核心的方法,它主要是完成以下功能

Ø         利用 getCurrentStep 方法取得当前步骤:如果只有一个有效步骤,直接返回;如果有多个有效当前步骤,返回符合条件的第一个

Ø         调用动作验证器来验证 transientvars 里面的变量

Ø         执行当前步骤中的所有 post-function

Ø         执行当前动作中的所有 pre-function

Ø         检查当前动作中的所有有条件结果,如果符合条件,验证 transientvars 里面的变量并执行有条件结果里面的 pre-function ;如果动作里面没有一个有条件结果,执行无条件结果,验证 transientvars 里面的变量并执行无条件结果里面的 pre-function

Ø         如果程序进入到一个 split 中: 1 )验证 transientvars 里面的变量; 2 )执行 split 中的 pre-function 3 )如果动作中的 finish 不等于 true ,执行 split 中所有 result 4 )结束当前步骤并将其移到历史步骤中去,创建新的步骤并执行步骤中的 pre-function 5 )执行 split 中的 post-function

Ø         如果进入 join 1 )结束当前步骤并将其移入历史步骤中; 2 )将刚结束的步骤和在 join 中的当前步骤还有历史步骤夹道 joinsteps 集合中并产生 joinnodes 对象,将此对象 put transientvars 里; 3 )检查 join 条件; 4 )执行 join 条件结果中的 validator 5 )执行 join 有条件结果中的 pre-function 6 )如果当前步骤不再历史步骤里面,把它移到历史步骤里面去; 7 )如果刚刚结束的当前动作中的 finish 不等于 true ,创建新步骤并执行新步骤中的 pre-function 8 )执行 join post-function

Ø         如果程序进入到另一个 step 中:结束当前步骤并将其移到历史步骤中去,并创建新的步骤并执行新步骤中的 pre-function

Ø         如果动作里面有符合条件的有条件结果,执行有条件结果里面的 post-functioin ;如果动作里面没有一个有条件结果,则执行无条件结果里面的 post-function

Ø         执行动作里面的 post-function

Ø         如果动作一开始是一个初始化状态,将设置 activated 标识,如果动作在 XML 里面有完成状态的标识,将设置 compleleted 标识

Ø         执行有效的自动动作( auto action

Ø         最后返回流程是否完成的布尔值:如果流程实例已经完结,返回 true ;否则返回 false

 

 

DoAction 方法

Ø         判断工作流的实例状态,如果状态不为 activated 1 ),直接返回

Ø         利用 findCurrentsteps 方法得到当前所有步骤列表

Ø         执行 populatetransientmap 方法,将 context workflowcontext ), entry workflowentry ), strore workflowstore ), configuration configuration ), descriptor workflowDescriptor )装进 transientvars ;将当前要执行的 actionid currentsteps 装进 transientvars ;将所有 XML 中配置的 register 装进 transientvars

Ø         检查全局动作( Global Action )和当前步骤里面所有动作的有效性。如果有无效动作,直接抛出异常

Ø         执行 transientionworkflow 方法传递工作流,如果捕获到 workflowexception ,抛出异常并回滚

Ø         如果动作中没有显示地表明 finish 的状态 true ,那么这时要执行 checkimplicitfinish 方法,查找当前步骤中是否还有有效动作,如果没有一个有效动作,则直接调用 completeentry 方法结束流程并将流程的状态设置为 completed 4

 

workflowDescriptor 对象里面的主要方法

getAction(id)

根据动作 ID 得到当前动作描述信息

getCommonActions()

得到通用动作列表

getGlobalActions()

得到全局动作列表

getGlobalConditions()

得到全局条件类标

getInitialAction(id)

根据初始动作 ID 得到初始动作描述信息

getInitialActions()

得到所有动作描述信息

getJoin(id)

得到联合描述信息

getJoins()

得到所有联合描述信息

getName()

得到工作流描述文件名称

getRegisters()

得到所有注册器

getSplit(id)

根据分支 ID 得到分支描述信息

getSplits()

得到所有分支描述信息

getStep(id)

根据步骤 ID 得到步骤描述信息

getSteps()

得到所有步骤描述信息

getTriggerFunction(id)

根据触发 ID 得到触发描述信息

getTriggerFunctions()

得到所有触发描述信息

 

 

 

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要内容: 2:工作流的执行过程 演示程序:Activiti控制台 3:Activiti介绍 Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。 3.1:工作流引擎 ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。 3.2:BPMN 业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram) 3.3:数据库(先学后看) Activiti数据库支持: Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第部分是表示表的用途的两个字母标识。 用途也和服务的API对应。 ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。 ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。 ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。 ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。 表结构操作: 3.3.1:资源库流程规则表 1)act_re_deployment 部署信息表 2)act_re_model 流程设计模型部署表 3)act_re_procdef 流程定义数据表 3.3.2:运行时数据库表 1)act_ru_execution 运行时流程执行实例表 2)act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 3)act_ru_task 运行时任务节点表 4)act_ru_variable 运行时流程变量数据表 3.3.3:历史数据库表 1)act_hi_actinst 历史节点表 2)act_hi_attachment 历史附件表 3)act_hi_comment 历史意见表 4)act_hi_identitylink 历史流程人员表 5)act_hi_detail 历史详情表,提供历史变量的查询 6)act_hi_procinst 历史流程实例表 7)act_hi_taskinst 历史任务实例表 8)act_hi_varinst 历史变量表 3.3.4:组织机构表 1)act_id_group 用户组信息表 2)act_id_info 用户扩展信息表 3)act_id_membership 用户与用户组对应信息表 4)act_id_user 用户信息表 这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足 3.3.5:通用数据表 1)act_ge_bytearray 进制数据表 2)act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录, 3.4:activiti.cfg.xml(activiti的配置文件) Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。 定义数据库配置参数: jdbcUrl: 数据库的JDBC URL。 jdbcDriver: 对应不同数据库类型的驱动。 jdbcUsername: 连接数据库的用户名。 jdbcPassword: 连接数据库的密码。 基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数): jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。 jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。 jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 省略...
【资源说明】 基于深度强化学习的云工作流调度python源码+详细注释+项目说明(毕业设计).zip 关键词:有向无环图,工作流,深度强化学习,图神经网络; 蒙特卡洛树搜索 Python 3.9.7 - torch 1.10 - gym 0.21.0 - networkx 2.6.3 1. 将 Env/___.py 文件注册在gym的环境中; 2. 运行 DAGs_generator.py 生成 train dataset, test dataset. 3. 修改环境代码适应生成数据集的路径; 4. 运行 PPO/DRLagent.py 训练网络; 5. 运行 PPO/DRLtest.py 测试推理。 5. 运行baseline_tableau.py 得出baseline算法效果 5. 运行MonteCarloTreeSearch.py 得出MCTS算法效果 马尔可夫决策过程建模 ### 状态空间 1. 当前执行的时间(1维) 2. 当前资源中剩余的 CPU 资源(1维) 3. 当前资源中剩余的 Memory 资源(1维) 4. Ready_task 任务列表(长度为 10)中的任务要求时间(30维)如果不足30空位补-1 5. Ready_task 任务列表中的 CPU 要求资源(30维) 如果不足30空位补-1 6. Ready_task 任务列表中的 Memory 要求资源(30维) 如果不足30空位补-1 7. 当前未完成 DAG 部分的最大路径长度(1维) 8. 当前未完成 DAG 部分的子节点数(1维) 9. 超出 Ready_task 任务列表长度且准备好的任务的时间要求总和(1维) 10. 超出 Ready_task 任务列表长度且准备好的任务的 CPU 要求总和(1维) 11. 超出 Ready_task 任务列表长度且准备好的任务的 Memory 要求总和(1维) 共98维状态。 更多项目细节及介绍,请见资源中的项目说明文档。 参数设定为: size = [20,30,40,50,60,70,80,90] #DAG中任务的数量 max_out = [1,2,3,4,5] #DAG节点的最大出度 alpha = [0.5,1.0,1.5] #控制DAG 的形状 beta = [0.0,0.5,1.0,2.0] #控制 DAG 的规则度 具体的实现细节如下: 1. 根据公式$length=\frac{\sqrt{size}}{alpha}$计算出生成DAG的层数,并计算平均每层的数量$\frac{size}{length}$. 2. 在以均值为$\frac{size}{length}$,标准差为$beta$的正态分布中采样每层的任务数并向上取整,这样随机采样得到的总任务数可能有偏差,随机在某几层添加或者删除任务,使DAG总任务数等于$size$。 3. 对于第一层到倒数第层:每一个任务随机在[0, $max\_out]$,并随机连接$n$个下一层的任务。 4. 最后给所有没有入边的任务添加Start作为父节点,所有没有出边的任务添加Exit任务作为子节点,至此一个随机的DAG就生成好了。 在这里$alpha$控制的是DAG的整体形状,如果$alpha$越小,DAG越长,$alpha$越大,DAG越短。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
本报告旨在对ICT企业行业岗位进行调研,了解当前ICT企业的招聘需求、薪资水平、职业发展等情况,为求职者提供参考。 一、ICT企业行业概述 ICT企业是信息通信技术企业的简称,主要涉及信息技术和通信技术两个领域。随着数字化、智能化、网络化等趋势的不断发展,ICT企业已成为现代经济的重要支柱之一,涉及电子商务、智能制造、物联网、云计算、大数据等众多领域。 、ICT企业行业岗位需求情况 1. 岗位需求类型 根据招聘信息统计,ICT企业主要招聘的岗位类型包括软件开发、网络与安全、数据分析、产品经理、运营、销售等。其中,软件开发和网络与安全是最为紧缺的岗位类型。 2. 岗位需求技能 ICT企业对于招聘人才的技能要求较高,主要包括以下几方面: (1)技术能力:如熟练掌握编程语言、数据库、网络协议等技术知识。 (2)沟通能力:良好的英语口语和写作能力,以及良好的团队合作能力。 (3)工作经验:对于高级岗位,通常要求有5年以上相关工作经验。 (4)自我学习能力:ICT企业的技术更新非常快,要求员工有自我学习和适应新技术的能力。 3. 岗位需求学历 ICT企业对于招聘人才的学历要求较高,通常要求本科及以上学历。其中,计算机、电子等相关专业的人才最受欢迎。 三、ICT企业行业薪资水平 ICT企业的薪资水平相对较高,与人才的技能和经验密切相关。根据招聘信息统计,ICT企业的薪资水平如下: 1. 软件开发岗位薪资:初级岗位平均薪资在8-12K左右,中级岗位平均薪资在12-20K左右,高级岗位平均薪资在20-30K左右。 2. 网络与安全岗位薪资:初级岗位平均薪资在8-12K左右,中级岗位平均薪资在12-20K左右,高级岗位平均薪资在20-30K左右。 3. 数据分析岗位薪资:初级岗位平均薪资在8-12K左右,中级岗位平均薪资在12-20K左右,高级岗位平均薪资在20-30K左右。 4. 产品经理岗位薪资:初级岗位平均薪资在10-15K左右,中级岗位平均薪资在15-25K左右,高级岗位平均薪资在25-40K左右。 5. 运营岗位薪资:初级岗位平均薪资在6-10K左右,中级岗位平均薪资在10-15K左右,高级岗位平均薪资在15-25K左右。 6. 销售岗位薪资:初级岗位平均薪资在6-10K左右,中级岗位平均薪资在10-15K左右,高级岗位平均薪资在15-25K左右。 四、ICT企业行业职业发展 1. 技术岗位职业发展:技术岗位的职业发展一般分为初级工程师、中级工程师、高级工程师、技术经理等几个阶段。在初级工程师阶段,主要负责完成项目中的具体技术实现;在中级工程师阶段,需要具备一定的技术管理能力,能够带领团队完成项目;在高级工程师阶段,需要具备较高的技术水平,能够独立负责重要项目的技术实现;在技术经理阶段,需要具备较强的技术管理和项目管理能力。 2. 非技术岗位职业发展:非技术岗位的职业发展一般分为初级岗位、中级岗位、高级岗位、部门经理、总监等几个阶段。在初级岗位阶段,主要负责完成基础的工作任务;在中级岗位阶段,需要具备较强的管理能力,能够带领团队完成工作任务;在高级岗位阶段,需要具备较高的管理能力,能够独立负责重要项目的管理;在部门经理和总监阶段,需要具备全面的管理能力,负责公司的战略规划和执行。 五、结论 ICT企业是一个蓬勃发展的行业,对于招聘人才的技能和学历要求较高,薪资水平相对较高。在职业发展方面,技术岗位和非技术岗位分别具有不同的职业发展路径。对于求职者来说,可以根据自身的兴趣和能力选择合适的岗位类型,积极提高技能和经验,努力实现职业目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值