复习步骤17- BPMN任务(2)服务任务

 

服务任务分类

  • Java Service Task :主要掌握这个就可以了
  • Shell Task
  • Web Service Task

 

Java Service Task --Java服务任务,在流程文件bpmn中配置标签

  • activiti:class:指定的自定义JAVA必须实现JavaDelegate、ActivityBehavior这两个接口的其中一个
  • activiti:delegateExpression  在bmpm文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"
  • activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,activiti:expression="${类.方法等}"

 

 

一、测试activiti:delegateExpression  在bpmn文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"

       1.1 新建 delegate.bpmn

         自定义实现了JavaDelegate、ActivityBehavior,而且必须序列化的类

       MyDelegate.java

package com.xiangshuai.act.c20;

import java.io.Serializable;

import org.activiti.engine.delegate.DelegateExecution;

import org.activiti.engine.delegate.JavaDelegate;

 

public class MyDelegate implements Serializable, JavaDelegate {

    @Override

    public void execute(DelegateExecution arg0) {

        System.out.println("delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>");

    }

 

}

 

 

     1.2 修改delegate.bpmn ,, 在bmpm文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"

         1.3 测试方法

public static void testActivitiDelegateExpression(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务 TaskService 任务管理TaskService

        RuntimeService runService = engine.getRuntimeService();

        TaskService taskService = engine.getTaskService();

      

        // 启动服务

        Deployment dep = rs.createDeployment().addClasspathResource("delegate.bpmn").deploy();

        ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

        /*

           百度RuntimeService  API

           startProcessInstanceByKey(String processDefinitionKey, String businessKey)

           Starts a new process instance in the latest version of the process definition with the given key.

           */

        Map<String, Object> vars=new HashMap<String, Object>();

        vars.put("myDelegate",new MyDelegate()); //bpmn 中用的key 就是 myDelegate

        //bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程

        ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

      

        /*   

           输出结果:当流程执行到Service Task 会执行对应的${myDelegate}对应的自定义类 MyDelegateexecute 输出

           "delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>"

         */

     }

 

二、测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,activiti:expression="${类.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))

 

 

2.1 新建bean.bpmn

     新建MyBean.java,并结合二下面的图的bpmn将对应的方法整出来

           MyBean.java

package com.xiangshuai.act.c20;

 

import java.io.Serializable;

 

import org.activiti.engine.runtime.Execution;

 

/**

 * @author lqx ,参照 bean.bpmn ,提供里面需要的方法print(Execution execution)

 * 需要的属性  name,bean.bpmn直接bean.点属性,和spring等一样都是调起首字母大写的get方法 getName;

 * 这个name runService.setVariable(“myName”, MyBean对象.getName)

 *

 */

public class MyBean implements Serializable{

    public String name="bean.bpmn要用来set";

   

   

    /**

     * 造方法,参照bean.bpmn

     *   <serviceTask id="servicetask2" name="Service Task"

                 activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>

     * @return execution.setVariable('myName', myBean.name)- runService.setVariable(“myName”, MyBean对象.getName())

     */

    public String getName(){

       return name;

    }

   

     /**

      * 造方法,参照

      * bean.bpmn myBean.print(execution) 带参数execution

     * <serviceTask id="servicetask1" name="Service Task" 

                  activiti:expression="${myBean.print(execution)}"></serviceTask>

     */

    public void print(Execution execution){

        System.out.println("执行bean.bpmnactiviti:expression=‘${myBean.print(execution)’ execution参数的id"+execution.getId());

     }

}

 

 

2.2  参照二下面的图修改bean.bpmn -- activiti:expression="${execution.setVariable('myName', myBean.name)}"--这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))

 

 

2.3 测试方法

/**

     *测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多

     *activiti:expression="${.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--

     *-这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name)

 

     */

    public static void testActivitiExpression(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务 TaskService 任务管理TaskService

       RuntimeService runService = engine.getRuntimeService();

       TaskService taskService = engine.getTaskService();

      

       // 启动服务

       Deployment dep = rs.createDeployment().addClasspathResource("bean.bpmn").deploy();

       ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

       /*

           百度RuntimeService  API

           startProcessInstanceByKey(String processDefinitionKey, String businessKey)s

           Starts a new process instance in the latest version of the process definition with the given key.

        */

       Map<String, Object> vars=new HashMap<String, Object>();

       vars.put("myBean",new MyBean()); //bpmn 中用的key 就是 myBean

       //bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程

      ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

       /*

        流程开始后,会自动执行 bean.bpmnservicetask1servicetask2 连个servicetask节点

        <serviceTask id="servicetask1" name="Service Task" 

                 activiti:expression="${myBean.print(execution)}"></serviceTask>

       <serviceTask id="servicetask2" name="Service Task"

                activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>

               servicetask1 会执行 myBean.print(execution) 方法 输出-执行bean.bpmnactiviti:expression=‘${myBean.print(execution)’ execution参数的id9

              

               servicetask2runService.setVariable(“myName”, myBean.getName())

       */

       //因为 servicetask2 已经 set 了一个myName 变量,所以我们可以取出来看下

       Object name = runService.getVariable(pi.getId(),"myName");//百度 RuntimeService api getVariable(String executionId, String variableName)

       System.out.println("bpmn设置的名字为"+name);

      

       /*   

        * 执行bean.bpmnactiviti:expression=‘${myBean.print(execution)’ execution参数的id9

           bpmn设置的名字为bean.bpmn要用来set

        */

    }

 

 

三。额外、Shell 任务,java中执行shell脚本--不是特别重要,有需要再来看看

   3.1  测试activiti 底层用的也是ProcessBuilder 做处理

         测试方法

//测试activiti 底层用的也是ProcessBuilder 做处理

    public static void javaShellTest() throws IOException{

        //创建命令集合

        List<String> argList = new ArrayList<String>();

        argList.add("cmd");

        argList.add("/c");

        argList.add("echo");

        argList.add("hello");

        argList.add("crazyit");

        ProcessBuilder processBuilder = new ProcessBuilder(argList);

        // 执行命令返回进程

        Process process = processBuilder.start();

        // 解析输出

        String result = convertStreamToStr(process.getInputStream());

        System.out.println(result); //输出 hello crazyit

    }

   

    //读取输出流并转换为字符串

    public static String convertStreamToStr(InputStream is) throws IOException {

        if (is != null) {

            Writer writer = new StringWriter();

            char[] buffer = new char[1024];

            try {

                Reader reader = new BufferedReader(new InputStreamReader(is,

                        "UTF-8"));

                int n;

                while ((n = reader.read(buffer)) != -1) {

                    writer.write(buffer, 0, n);

                }

            } finally {

                is.close();

            }

            return writer.toString();

        } else {

            return "";

        }

    }

 

 

3.2 读 shell.bpmn

     新建 shell.bpmn

    修改 shell.bpmn -- 指定Service Task activiti:type="shell"

extensionElements shell脚本放入,如下图:

   测试代码

  // shell脚本写在shell.bpmn

    public static void shellTest(){

        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

         // 存储服务

         RepositoryService rs = engine.getRepositoryService();

         // 运行时服务

         RuntimeService runService = engine.getRuntimeService();

         // 任务服务

         TaskService taskService = engine.getTaskService();

         Deployment dep = rs.createDeployment().addClasspathResource("shell.bpmn").deploy();

         ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

        

         // 启动流程

         ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

        

         System.out.println("参数值:" + runService.getVariable(pi.getId(), "javaHome")); //输出结果D:\installation\installation\java8\jdk8

        

    }

 

 

总测试类ServiceTaskTest.java

package com.xiangshuai.act.c20;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;

import java.io.StringWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import org.activiti.engine.ProcessEngine;

import org.activiti.engine.ProcessEngines;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.RuntimeService;

import org.activiti.engine.TaskService;

import org.activiti.engine.repository.Deployment;

import org.activiti.engine.repository.ProcessDefinition;

import org.activiti.engine.runtime.ProcessInstance;

 

 

/**

 * @author lqx

 * 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤17- BPMN任务(2)服务任务

 * 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤17- BPMN任务(2)服务任务

 *

 */

public class ServiceTaskTest {

          public static void main(String[] args) {

                  //testActivitiDelegateExpression();

                  // testActivitiExpression();

                  /* try {

                          javaShellTest();

                  } catch (IOException e) {

                          // TODO Auto-generated catch block

                          e.printStackTrace();

                  }*/

                   shellTest();

         }

     /**

     * 测试activiti:delegateExpression  在bpmn文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"

     */

    public static void testActivitiDelegateExpression(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

                   // 存储服务

                   RepositoryService rs = engine.getRepositoryService();

                   // 运行时服务 和TaskService 任务管理TaskService

                   RuntimeService runService = engine.getRuntimeService();

                   TaskService taskService = engine.getTaskService();

                 

                   // 启动服务

                   Deployment dep = rs.createDeployment().addClasspathResource("delegate.bpmn").deploy();

                   ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

                   /*

                      百度RuntimeService  API

                          startProcessInstanceByKey(String processDefinitionKey, String businessKey)

                          Starts a new process instance in the latest version of the process definition with the given key.

                          */

                   Map<String, Object> vars=new HashMap<String, Object>();

                   vars.put("myDelegate",new MyDelegate()); //bpmn 中用的key 就是 myDelegate

                   //bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程

                   ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

                 

                   /*   

                      输出结果:当流程执行到Service Task 会执行对应的${myDelegate}对应的自定义类 MyDelegate的execute 输出

                      "delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>"

                    */

     }

    /**

     *测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,

     *activiti:expression="${类.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--

     *-这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))

 

     */

    public static void testActivitiExpression(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务 和TaskService 任务管理TaskService

             RuntimeService runService = engine.getRuntimeService();

             TaskService taskService = engine.getTaskService();

            

             // 启动服务

             Deployment dep = rs.createDeployment().addClasspathResource("bean.bpmn").deploy();

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

             /*

                      百度RuntimeService  API

                          startProcessInstanceByKey(String processDefinitionKey, String businessKey)s

                          Starts a new process instance in the latest version of the process definition with the given key.

              */

             Map<String, Object> vars=new HashMap<String, Object>();

             vars.put("myBean",new MyBean()); //bpmn 中用的key 就是 myBean

             //bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程

             ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

             /*

              流程开始后,会自动执行 bean.bpmn的servicetask1和servicetask2 连个servicetask节点

              <serviceTask id="servicetask1" name="Service Task" 

                 activiti:expression="${myBean.print(execution)}"></serviceTask>

            <serviceTask id="servicetask2" name="Service Task"

                activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>

               servicetask1 会执行 myBean.print(execution) 方法 输出-执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9

              

               servicetask2会runService.setVariable(“myName”, myBean.getName())

             */

             //因为 servicetask2 已经 set 了一个myName 变量,所以我们可以取出来看下

             Object name = runService.getVariable(pi.getId(),"myName");//百度 RuntimeService api getVariable(String executionId, String variableName)

             System.out.println("bpmn设置的名字为"+name);

            

             /*   

              * 执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9

           bpmn设置的名字为bean.bpmn要用来set

              */

    }

   

    //测试activiti 底层用的也是ProcessBuilder 做处理

    public static void javaShellTest() throws IOException{

        //创建命令集合

        List<String> argList = new ArrayList<String>();

        argList.add("cmd");

        argList.add("/c");

        argList.add("echo");

        argList.add("hello");

        argList.add("crazyit");

        ProcessBuilder processBuilder = new ProcessBuilder(argList);

        // 执行命令返回进程

        Process process = processBuilder.start();

        // 解析输出

        String result = convertStreamToStr(process.getInputStream());

        System.out.println(result); //输出 hello crazyit

    }

   

    //读取输出流并转换为字符串

    public static String convertStreamToStr(InputStream is) throws IOException {

        if (is != null) {

            Writer writer = new StringWriter();

            char[] buffer = new char[1024];

            try {

                Reader reader = new BufferedReader(new InputStreamReader(is,

                        "UTF-8"));

                int n;

                while ((n = reader.read(buffer)) != -1) {

                    writer.write(buffer, 0, n);

                }

            } finally {

                is.close();

            }

            return writer.toString();

        } else {

            return "";

        }

    }

   

   

    // shell脚本写在shell.bpmn中

    public static void shellTest(){

              ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

         // 存储服务

         RepositoryService rs = engine.getRepositoryService();

         // 运行时服务

         RuntimeService runService = engine.getRuntimeService();

         // 任务服务

         TaskService taskService = engine.getTaskService();

         Deployment dep = rs.createDeployment().addClasspathResource("shell.bpmn").deploy();

         ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

        

         // 启动流程

         ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

        

         System.out.println("参数值:" + runService.getVariable(pi.getId(), "javaHome")); //输出结果D:\installation\installation\java8\jdk8

        

    }

   

   

}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue-BPMN-Element是一个基于Vue.js框架开发的业务流程建模工具。它提供了一套丰富的组件和功能,帮助开发人员快速搭建并定制化业务流程设计器。 Vue-BPMN-Element的主要特点包括: 1. 强大的可扩展性:Vue-BPMN-Element提供了丰富的组件和插件,允许开发人员根据项目需求进行定制化开发。这些组件和插件可实现诸如拖拽、连接线、节点属性编辑等功能,满足各种业务流程的建模需求。 2. 可视化编辑:Vue-BPMN-Element提供了直观的界面,允许用户通过拖拽和连接线的方式创建和编辑业务流程。用户可以通过可视化的界面来管理和优化业务流程,极大地提高了开发效率和用户体验。 3. 高度定制化:Vue-BPMN-Element提供了丰富的配置选项和事件钩子,可以完全适应不同的业务需求。开发人员可以根据具体项目需求,灵活地定制展示样式、交互方式等,实现个性化的业务流程建模工具。 4. 良好的兼容性:Vue-BPMN-Element基于Vue.js框架开发,具有良好的兼容性和扩展性。它可以与其他Vue.js插件和工具库无缝集成,为项目提供更加全面和高效的解决方案。 总之,Vue-BPMN-Element是一个强大、可定制化和易用的业务流程建模工具,通过它可以快速搭建和管理业务流程,提高开发效率和项目质量。无论是小型项目还是大型企业应用,Vue-BPMN-Element都是一个值得考虑的选择。 ### 回答2: vue-bpmn-element是一个基于Vue.js框架的BPMN(Business Process Model and Notation)流程图绘制组件库。BPMN是一种用于描述业务流程的图形化标准,可以方便地表示和分析企业的各个流程。 vue-bpmn-element提供了一系列可复用的组件,用户可以在自己的Vue应用中轻松地集成和使用这些组件。这个库的设计目标是提供一个简洁、易用且高度可定制的BPMN流程图绘制解决方案。 使用vue-bpmn-element,用户可以创建自定义的BPMN流程图,包括各种元素如任务、网关、事件等。这些元素可以通过拖拽、缩放和连接等操作进行编辑和布局。用户还可以为每个元素设置相关属性和约束条件,以便更好地描述和分析业务流程。 在vue-bpmn-element中,还提供了一些实用的功能,如历史记录、撤销恢复、导入导出等。这些功能可以帮助用户方便地管理和操作流程图,提高工作效率。 总之,vue-bpmn-element是一个功能丰富且易于使用的BPMN流程图绘制组件库,通过它,用户可以轻松地创建、编辑和管理自定义的业务流程,帮助企业提高业务流程的可视化管理水平,提高工作效率。 ### 回答3: vue-bpmn-element是一个基于Vue.js的开源项目,它提供了一组可在业务流程管理界面中使用的BPMN(Business Process Model and Notation)元素和功能。 首先,vue-bpmn-element具有良好的可定制性。它提供了一系列可自定义的BPMN元素,如任务、网关、边界事件等,使用户能够根据自己的需求进行灵活的配置和设计。此外,它还支持自定义样式和图标,让用户能够根据自己的品牌或用户界面的要求对BPMN流程进行个性化的呈现。 其次,vue-bpmn-element提供了丰富的交互功能。用户可以通过拖拽、缩放等操作来创建、修改和连接BPMN元素,实现业务流程的设计和调整。同时,它还支持多种事件,如点击、双击、鼠标悬停等,使用户能够对BPMN流程进行更加直观和便捷的操作。 此外,vue-bpmn-element还提供了一些实用的功能和工具。例如,它允许用户导入/导出BPMN文件,从而方便地与其他系统或工具进行集成。它还支持撤销/重做操作,保证用户在编辑过程中的操作精确和安全。另外,它也提供了一些常用的扩展,如条件流程、消息传递等,使用户能够更加灵活地定义和管理业务流程。 总之,vue-bpmn-element是一个功能强大且易于使用的BPMN元素集合,它为用户提供了一套完整的工具和功能,帮助用户进行业务流程的设计、管理和优化。无论是初学者还是有经验的开发者,都可以通过vue-bpmn-element轻松地搭建出高效和可扩展的业务流程管理系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值