精华内容
下载资源
问答
  • 工作流引擎

    2017-12-14 10:03:48
    本文档简单介绍了工作流引擎的概念和一些技术特点,对比了当前主流的流程引擎之间的区别。
  • 工作流引擎

    2006-11-11 15:41:00
    工作流引擎 当今社会分工越来越细,在一个单位内部也越来越强调专业化,大部分工作都需要多个部门和员工合作完成。一个制度良好的单位往往对各种工作的工作流程以文件的形式固定下来,即使是管理不太正规的单位也有...

    工作流引擎 
     当今社会分工越来越细,在一个单位内部也越来越强调专业化,大部分工作都需要多个部门和员工合作完成。一个制度良好的单位往往对各种工作的工作流程以文件的形式固定下来,即使是管理不太正规的单位也有约定俗成的工作步骤。这种工作流程保证了一件任务能按预定的顺序从起点流向终点,并且在需要的时候可以跟踪、查询和统计。工作流包括以下几个要素:
    实体(Entity) :是工作流的主体,是需要随着工作流一起流动的物件(Object)。例如,在一个采购申请批准流程中,实体就是采购申请单;在公文审批流程中,实体就是公文。
    参与者(Participant) :是各个处理步骤中的责任人,可能是人,也可能是某个职能部门,还可能是某个自动化的设备;
    流程定义(Flow Definition) :是预定义的工作步骤,它规定了实体流动的路线。它可能是完全定义的,即对每种可能的情况都能完全确定下一个参与者,也可能是不完全定义的,需要参与者根据情况决定下一个参与者;
    工作流引擎(Engine) :是驱动实体按流程定义从一个参与者流向下一个参与者的机制
        可以看出,前三个要素是静态的,而第四个要素是动态的,它将前三者结合起来,是工作流的核心组成元素。

    为什么需要电子化的工作流(eWorkFlow)?
        手工处理的工作流主要有以下几个缺点:

    • 不能及时得到处理 一个步骤完成后必须将实体物理地转移给下一个参与者,当工作量增大时,很难分清哪些是重要而需要及时处理的,甚至经常出现上一个步骤已经完成了,而下一个步骤还不知道的情况;
    • 无法跟踪 传统的手工操作要求有一个人自始至终地跟着单子(比如采购申请单)走,否则流程中的任何一个人也无法知道一项任务当前的处理位置,当出现停顿时甚至无法知道该找谁解决;
    • 效率不高 很多实际上可以并行处理的步骤(例如公文审批过程中的会签),在手工处理的时候,只能一个接一个的串行处理;
    • 缺乏分析功能 流程是人制定的,是否适合实际情况只能通过实际工作检验。但手工处理无法统计各个环节的处理效率,因此对流程的评估都是大致的,凭感觉的,无法量化,对流程的改造缺乏科学的统计数据做基础。
      通过采用先进的信息技术,以上问题可以迎刃而解。软件的力量,是把繁杂而没有条理的工作,分门别类地整理出来,给每个人一个清楚的视图,及时了解当前的工作状态,易于跟踪和查询。同时强大的统计分析功能便于从海量的数据中找出人工统计所无法发现的规律,并据此做出正确的决策。

     

    工作流(Workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。 工作流管理系统(Workflow Management System, WfMS)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。

    工作流系统的主要组成部分
    ----1.过程定义工具

    ----过程定义工具被用来创建计算机可处理的业务过程描述。它可以是形式化的过程定义语言或对象关系模型,也可以是简单地规定用户间信息传输的一组路由命令。

    ----2.过程定义

    ----过程定义(数据)包含了所有使业务过程能被工作流执行子系统执行的必要信息。这些信息包括起始和终止条件、各个组成活动、活动调度规则、各业务的参与者需要做的工作、相关应用程序和数据的调用信息等。

    ----3.工作流执行子系统(WES)和工作流引擎

    ----工作流执行子系统也称为(业务)过程执行环境,包括一个或多个工作流引擎。工作流引擎是WFMS的核心软件组元。它的功能包括:解释过程定义;创建过程实例并控制其执行;调度各项活动;为用户工作表添加工作项;通过应用程序接口(API)调用应用程序;提供监督和管理功能等。工作流执行子系统可以包括多个工作流引擎,不同工作流引擎通过协作共同执行工作流。

    ----4.工作流控制数据

    ----指被WES和工作流引擎管理的系统数据,例如工作流实例的状态信息、每一活动的状态信息等。

    ----5.工作流相关数据

    ----指与业务过程流相关的数据。WFMS使用这些数据确定工作流实例的状态转移,例如过程调度决策数据、活动间的传输数据等。工作流相关数据既可以被工作流引擎使用,也可以被应用程序调用。

    ----6.工作表和工作表处理程序

    ----工作表列出了与业务过程的参与者相关的一系列工作项,工作表处理程序则对用户和工作表之间的交互进行管理。工作表处理程序完成的功能有:支持用户在工作表中选取一个工作项,重新分配工作项,通报工作项的完成,在工作项被处理的过程中调用相应的应用程序等。

    ----7.应用程序和应用数据

    ----应用程序可以直接被WFMS调用或通过应用程序代理被间接调用。通过应用程序调用,WFMS部分或完全自动地完成一个活动,或者对业务参与者的工作提供支持。与工作流控制数据和相关数据不同,应用数据对应用程序来讲是局部数据,对WFMS的其他部件来说是不可见的。

    展开全文
  • 什么是工作流引擎工作流引擎是一个软件应用程序或工具,旨在帮助用户执行一系列构成“业务流程”或“工作流”的重复任务。工作流引擎从工作流的设计中获取提示,并指导流程完成其各个步骤。这是通过工作流自动化来...

    什么是工作流引擎?

    工作流引擎是一个软件应用程序或工具,旨在帮助用户执行一系列构成“业务流程”或“工作流”的重复任务。工作流引擎从工作流的设计中获取提示,并指导流程完成其各个步骤。这是通过工作流自动化来完成的。

    许多人认为工作流引擎和业务规则引擎是相同的。有些甚至认为可以互换地使用工作流引擎和业务规则引擎的术语,但实际上它们是完全不同的概念。

    34339b88d39bc06f0725e955e95b556f.png

    让我们看一下这两个术语在实际使用中的一些差异,来消除对这两个术语的误会。

    工作流是将数据处理成完成状态的一系列任务。这是一个有时间限制的编排,任务具有重复性和预测性。例如,当你从你最喜欢的网上商店买一条牛仔裤时,它启动了一个涉及付款处理、订单履行和发货等多个步骤的工作流。

    并且在数量众多的企业中大多数工作流程都是手动完成的,通过电子邮件或书面文件进行审批。但近年来,现代化企业已经使用工作流软件实现他们的工作流自动化,以此提高速度、准确性和成本效率。

    大多数这些工具都是用流程设计器编码完成的,该特性允许软件用户在不需要编码的情况下运行工作流实例。工作流设计器允许管理员以线性顺序派发任务,根据表单中的数据动态分配任务,并添加条件、异常、并行分支等设定来丰富工作流的种类。

    那么工作流引擎是从哪里来的呢?在这种情况下,工作流引擎是一个预先编码的脚本,它考虑了工作流设计,即任务应该如何从一个阶段流向另一个阶段,并执行该步骤。工作流引擎是嵌入在软件中的代码,用于将任务从一个阶段推送到另一个阶段。

    什么是业务规则引擎?

    业务规则引擎可以理解为程序中的一组条件,如果满足所有条件,则执行相应的程序代码。它是关于设置一个软件在特定参数内的行为准则。规则引擎的优点是,它允许非技术性软件用户根据其业务需求更改软件行为,而无需更改底层代码。业务规则引擎根据大量的信息数据做出快速可靠的决策,通常这些数据对于人类大脑来说太大了,无法处理。

    业务规则引擎是一个更广泛的概念中的一部分,它的范围甚至超出了工作流管理。规则引擎无法控制编排任务,但它们根据特定条件为推断决策指南。同时,它还可用于在给定条件下模拟工作流的过程。

    例如下面这个电子商务网站如何将以下规则引擎之一应用于其支付网关的示例:如果买家年龄在18到29岁之间,可享受15%的青年折扣;如果买家选择年龄大于59岁,则对该商品给予20%的折扣;如果买家选择年龄在30到59岁之间,则不对该商品进行折扣。

    组合在一起的一组业务规则引擎称为规则集;它们通常以表格形式或决策树表示。企业软件主要使用业务规则引擎来确保操作的一致性。

    工作流引擎与业务规则引擎的区别

    工作流引擎和业务规则引擎都允许非技术性的最终用户在运行时更改流程行为,而无需更改代码。但它们的不同之处多于相似之处。如上所述,它们的工作模式和目的有着根本的不同。下面列出了工作流引擎和业务规则引擎之间的一些其他区别:

    a4694b41fe19eae754817a9cfe7fb95d.png

    结论

    在寻找工作流和BPM软件时,我们要学会区分两者不同以及认清你企业的诉求。选择工作流引擎与业务规则引擎混合起来的软件产品很容易,但要区分它们为企业所用,则需要花费心思认真考核。

    展开全文
  • 工作流及工作流引擎简介
  • spring 工作流引擎 几个月前,在处理一个公司项目时,我们需要开发REST服务,该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间,我们决定创建简单的工作流引擎,该引擎将为发送电子邮件收费...

    spring 工作流引擎

    几个月前,在处理一个公司项目时,我们需要开发REST服务,该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间,我们决定创建简单的工作流引擎,该引擎将为发送电子邮件收费,但该引擎也可用于任何类型的简单流。

    在本文中,我将逐步说明如何实现可处理序列流的简单工作流引擎。

    为了实现此工作流引擎,我们使用了spring框架,但是无论使用哪种框架,也可以不使用任何框架,如何在任何框架上实现该想法都应相同。

    我们将从对序列工作流程模式的简短介绍开始,然后,我们将研究所需的接口,最后,我们将从使用Spring实现工作流程引擎开始。

    序列工作流程模式

    序列工作流程模式描述了其中每个步骤(动作)一步一步地完成的工作流程。 在下一张图片上,您可以看到它的外观:

    流中将要处理的每个动作都共享相同的上下文,这使流的参与者之间可以共享信息。 使用公共上下文的想法是因为每个步骤都应该彼此独立,并且应该将它们作为其他流程的一部分轻松添加。

    如果要获取有关序列工作流程模式的更多信息,请访问: 序列模式

    定义所需的界面

    下一步是创建一组接口,使我们可以轻松创建工作流程并定义工作流程操作。

    我们可以从Workflow界面开始。 该接口负责处理工作流程操作,实际上它定义了我们的工作流程引擎应该执行的操作。 这是一个非常简单的界面,只有一种方法“ processWorkflow”。

    此方法由工作流引擎调用,用于为工作流提供可在工作流内部使用的初始对象,它表示每个工作流的起点。

    package ba.codecentric.workflow;
    
    import java.util.Map;
    
    /**
    
    * Process email workflow.
    
    *
    
    * @author igor.madjeric
    
    *
    
    */
    
    public interface Workflow {
    
    /**
    
    * Method for processing workflow.
    
    *
    
    * @param parameters
    
    * maps of object which are needed for workflow processing
    
    * @return true in case that workflow is done without errors otherwise false
    
    */
    
    public boolean processWorkflow(Map<String, Object> parameters);
    
    }
    
    Next what we need is interface used for defining workflow action. This is also simple interface whit only one method too.
    
    package ba.codecentric.workflow;
    /**
    
    * Define workflow action
    
    *
    
    * @author igor.madjeric
    
    *
    
    */
    
    public interface WorkflowAction {
    
    /**
    
    * Execute action.
    
    *
    
    * @param context
    
    * @throws Exception
    
    */
    
    public void doAction(Context context) throws Exception;
    
    }
    
    So this interface define only doAction method which will be called by workflow implementation.
    
    Last interface which we need to define is Context interface. This interface define two methods, one for setting object in context and another for retrieving it.
    
    package ba.codecentric.workflow;
    
    /**
    
    * Context interface.
    
    *
    
    * Class which extend this interface should be able to provide mechanism for keeping object in context.<br />
    
    * So they can be shared between action inside workflow.
    
    *
    
    * @author igor.madjeric
    
    *
    
    */
    
    public interface Context {
    
    /**
    
    * Set value with specified name in context.
    
    * If value already exist it should overwrite value with new one.
    
    *
    
    * @param name of attribute
    
    * @param value which should be stored for specified name
    
    */
    
    public void setAttribute(String name, Object value);
    
    /**
    
    * Retrieve object with specified name from context,
    
    * if object does not exists in context it will return null.
    
    *
    
    * @param name of attribute which need to be returned
    
    * @return Object from context or null if there is no value assigned to specified name
    
    */
    
    public Object getAttribute(String name);
    
    }

    这是我们需要为简单工作流程定义的所有接口

    实施简单的工作流引擎

    定义接口之后,我们可以从实现工作流引擎开始。 引擎应具备的功能有一些要求。

    该引擎应支持顺序工作流程,这意味着一个接一个地执行动作。

    发动机也应该能够进动多于一个的流量。

    工作流操作应该能够彼此共享信息。

    如我们所见,并没有很多要求,所以我们应该从实现它开始。

    首先,我们可以创建上下文类,该上下文类将用于处理动作之间的信息。 此类实现Context接口,并且不执行其他任何操作。

    package ba.codecentric.workflow.impl;
    
    import java.util.HashMap;
    import java.util.Map;
    import ba.codecentric.workflow.Context;
    
    /**
    * Save states between different workflow action.
    *
    * @author igor.madjeric
    *
    */
    public class StandardContext implements Context {
    
    private Map<String, Object> context;
    
    /**
    
    * Create context object based.
    *
    * @param parameters
    */
    public StandardContext(Map<String, Object> parameters) {
    if (parameters == null) {
    this.context = new HashMap<String, Object>();
    } else {
    this.context = parameters;
    }
    }
    
    @Override
    public Object getAttribute(String name) {
    return context.get(name);
    }
    
    @Override
    public void setAttribute(String name, Object value) {
    context.put(name, value);
    }
    
    }

    第二步是创建实现Workflow接口的类。 我们称此类为StandardWorkflow。 除了实现Workflow接口之外,该类还实现了ApplicationContextAware接口,因为需要访问spring bean存储库。 如果您不使用spring,则不需要实现它。

    我们已经说过,工作流应该支持一个以上的流。
    因此,可以将一个工作流程的操作定义为一个列表,并且每个列表都应分配一个逻辑名称。 因此,对于动作注册,我们可以使用Map <String,List <WorkflowAction >>之类的东西。 首先,我们将看到SpringBean的StandardWorkflow和一个自定义流程的定义,然后我们将看到StandardWorkflow的实现。

    Bean的StandardWorkflow定义:

    <bean id='standardWorkflow'
    
    class='de.codecentric.oev.external.services.workflow.standard.StandardWorkflow'>
    
    <property name='workflowActions'>
    
    <map>
    
    <!-- <entry key='<CID>_action'><ref bean='<CID>_action'/></entry>-->
    
    <!-- OEVBS -->
    
    <entry key='action1_action'>
    
    <ref bean='action1_action' />
    
    </entry>
    
    <!-- PVN -->
    
    <entry key='action2_action'>
    
    <ref bean='action2_action' />
    
    </entry>
    
    <!-- WPV -->
    
    <entry key='action3_action'>
    
    <ref bean='action3_action' />
    
    </entry>
    
    </map>
    
    </property>
    
    </bean>

    从这个bean定义中,我们可以看到我们为每个客户定义了操作,并且在引用bean中定义了操作列表。

    这是其中一个客户Bean的示例:

    <bean id='action1_action' class='java.util.ArrayList'>
    
    <constructor-arg>
    
    <!-- List of Actions -->
    
    <list value-type='ba.codecentric.workflow.WorkflowAction' >
    
    <ref local='createEmailAction'/>
    
    <ref bean='sendEmailAction'/>
    
    </list>
    
    </constructor-arg>
    
    </bean>

    现在我们可以看到StandardWorkflow的样子:

    package ba.codecentric.workflow.impl;
    
    import java.util.List;
    
    import java.util.Map;
    
    import org.apache.commons.logging.Log;
    
    import org.apache.commons.logging.LogFactory;
    
    import org.springframework.beans.BeansException;
    
    import org.springframework.context.ApplicationContext;
    
    import org.springframework.context.ApplicationContextAware;
    
    import ba.codecentric.workflow.Context;
    
    import ba.codecentric.workflow.Workflow;
    
    import ba.codecentric.workflow.WorkflowAction;
    
    /**
    
    * Define standard workflow for sending email.
    
    *
    
    * @see Workflow
    
    *
    
    * @author igor.madjeric
    
    *
    
    */
    
    public class StandardWorkflow implements Workflow,
    
    ApplicationContextAware {
    
    private final Log LOG = LogFactory.getLog(StandardWorkflow.class);
    
    private static final String ACTION = 'action';
    
    private Map<String, List<WorkflowAction>> workflowActions;
    
    private ApplicationContext applicationContext;
    
    /**
    
    *@see de.codecentric.oev.external.services.workflow.Workflow#processWorkflow(java.util.Map)
    
    */
    
    @Override
    
    public boolean processWorkflow(String workflofName, Map<String, Object> parameters) {
    
    Context context = new StandardContext(parameters);
    
    List<WorkflowAction> actions = getWorkflowActions(workflofName);
    
    for (WorkflowAction action : actions) {
    
    try {
    
    action.doAction(context);
    
    } catch (Exception e) {
    
    StringBuilder message = new StringBuilder(
    'Failed to complete action:' + action.toString());
    
    message.append('\n');
    
    message.append(e.getMessage());
    
    LOG.error(message.toString());
    
    return false;
    
    }
    
    }
    
    return true;
    
    }
    private List<WorkflowAction> getWorkflowActions(String actionName) {
    
    List<WorkflowAction> actions = workflowActions.get(actionName);
    
    if (actions == null || actions.isEmpty()) {
    
    LOG.error('There is no defined action for ' + actionName);
    
    throw new IllegalArgumentException(
    'There is no defined action for ' + actionName);
    
    }
    
    return actions;
    
    }
    @Override
    
    public void setApplicationContext(ApplicationContext applicationContext)
    throws BeansException{
    this.applicationContext = applicationContext;
    
    }
    // Getter/Setter
    
    public Map<String, List<WorkflowAction>> getWorkflowActions() {
    
    return workflowActions;
    
    }
    public void setWorkflowActions(
    
    Map<String, List<WorkflowAction>> workflowActions) {
    
    this.workflowActions = workflowActions;
    
    }
    }

    再次您可以看到,这也是一个简单的类,所有工作都在processWorkflow方法中完成,我们向其提供流程名称和输入参数。 此方法使用指定的参数创建Context,然后尝试加载为指定流定义的操作,如果存在具有指定名称的流,它将开始运行流。

    如何开始流程

    这取决于您的需要。 您可以使用我们这样的休息服务,也可以使用其他任何机制(例如MBean),计划的作业,也可以直接从某些服务中进行呼叫。 您需要做的就是调用processWorkflow方法。

    参考:来自ICG Madjeric博客的JCG合作伙伴 Igor Madjeric的《 Spring的简单工作流引擎》

    翻译自: https://www.javacodegeeks.com/2012/11/simple-workflow-engine-with-spring.html

    spring 工作流引擎

    展开全文
  • 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用的工作流引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的),名称叫CoreFlow;功能相对Activiti来说比较弱,但是...
  • GooFlow21工作流引擎

    2018-01-30 11:14:00
    GooFlow工作流引擎,GooFlow工作流引擎需要的赶紧来下载吧。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,447
精华内容 3,378
关键字:

工作流引擎