欢迎来到看球吧,免费NBA直播吧,足球直播,英超,西甲,意甲,德甲,法甲,世界杯等体育赛事高清直播这里都能找到!

中超 世界杯 英超 西甲 意甲 德甲 欧联杯 法甲 欧冠杯 欧洲国家杯 CBA NBA
当前位置:看球吧 > 体育资讯 > 综合资讯 > 正文

张怡宁简介(Activiti7工作流+SpringBoot(上))

发布日期:2023-06-19 15:21:06 阅读(213) 本文章共有 字,看完大约需要 分钟的时间

简介:本文内容由看球吧整理编辑,主要讲解的内容是:文章目录一. Activiti相关概念1. Activiti介绍2. 核心类2.1 ProcessEngine2.2 服务(Service)类2.2.1 TaskService2.2.2 RepositoryService2.2.3 RuntimeService2.2.3 HistoryService2.3 CommandContextIntercepter或CommandExecutor2.4 核心业......的相关信息,具体详情阅读下文。

文章目录

    • 一. Activiti相关概念
      • 1. Activiti介绍
      • 2. 核心类
        • 2.1 ProcessEngine
        • 2.2 服务(Service)类
          • 2.2.1 TaskService
          • 2.2.2 RepositoryService
          • 2.2.3 RuntimeService
          • 2.2.3 HistoryService
        • 2.3 CommandContextIntercepter或CommandExecutor
        • 2.4 核心业务对象
      • 3. 上下文组件(Context)
        • 3.1 CommandContext
        • 3.2 ProcessEngineConfigurationImpl
        • 3.3 ExecutionContext
        • 4. 持久化组件
        • 5. Event-Listener组件
        • 6. Cache组件
        • 7. 异步执行组件
        • 8. PVM:Process Virtal Machine
    • 二. Eclipse插件安装:
    • 三. 项目搭建
      • 1. 新建Spring Boot工程
      • 2. 引入Activiti相关依赖
      • 3. 创建流程图
      • 4. 启动工程
      • 5. 修改配置
        • 5.1 添加MySQL依赖
        • 5.2 修改数据库
        • 5.3 Activiti相关配置
        • 5.4 附上application.yml完整配置:
        • 5.5 启动工程
      • 6. 编写实例
        • 6.1 引入Thymeleaf依赖,(前端使用Thymeleaf的配置已经在application.yml中)
        • 6.2 创建Controller控制器
        • 6.3 流程跟踪与流程图展示
        • 6.4 附上DemoController完整代码
      • 7. 效果

一. Activiti相关概念

1. Activiti介绍

    Activiti是基于Apache许可的开源BPM平台,创始人Tom Baeyens原是JBPM架构师,可以理解为与JBPM出自同一祖师爷。它提供了Eclipse插件,开发可以通过插件直接绘制业务流程图。基于Spring,ibatis等框架,并在此之上构建了非常清晰的开发框架。是由Alfresco软件发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。 本文基于Activiti7的Activiti Core,基于Spring Boot做简单学习总结。(Activiti最新版本向微服务这边靠齐了,并分Activiti Core与Activiti Cloud两块,Activiti Cloud还没研究)

2. 核心类

2.1 ProcessEngine

    流程引擎的抽象,可以通过此类获取需要的所有服务。

2.2 服务(Service)类

    通过ProcessEngine获取,Activiti将不同生命周期的服务封装在不同Service中,包括定义、部署、运行。通过服务类可获取相关生命周期中的服务信息。

2.2.1 TaskService

    流程运行过程中,每个任务节点的相关操作接口,如complete,delete,delegate等。

2.2.2 RepositoryService

    流程定义和部署相关的存储服务。

2.2.3 RuntimeService

    流程运行时相关的服务,如根据流程好启动流程实例startProcessInstanceByKey。

2.2.3 HistoryService

    历史记录相关服务接口。

2.3 CommandContextIntercepter或CommandExecutor

    Activiti使用命令模式作为基础开发模式,如Service中调用的各个方法都对应相应的命令对象。Service将请求委托给命令对象,命令对象来命令接受者,接受者接收后执行并返回结果。而CommandContextIntercepter的作用是拦截所有命令,并在命令前后执行一些公共方法。

2.4 核心业务对象

    org.activiti.engine.impl.persistence.entity包下的类,包括Task,ProcessInstance,Execution等。会根据不同职责实现相应接口的方法(如需要持久化则继承PersistentObject接口),与传统的实体类不同。

3. 上下文组件(Context)

    用来保存生命周期比较长,全局性的信息,类似Application,主要包括如下三类。

3.1 CommandContext

    命令上下文,保存每个命令必要的资源,如持久化需要的session。

3.2 ProcessEngineConfigurationImpl

    流程引擎相关配置信息,整个引擎全局的配置信息,如数据源DataSource等。该对象为单例,在流程引擎创建的时候初始化。

3.3 ExecutionContext

    持有ExecutionEntity对象。

4. 持久化组件

    Activiti使用ibatis作OR映射,并在此基础上增加设计了自己的持久化框架。在流程引擎创建时初始化。顶层接口Session、SessionFactory。Session有两个实现类:DbSqlSession,负责sql表达式的执行。AbstractManager负责对象的持久化操作。SessionFactory有两个实现类:DbSqlSessionFactory负责DbSqlSession相关操作,GenericManagerFactory负责AbstractManager相关操作。

5. Event-Listener组件

    Activiti允许客户代码介入流程执行,提供了事件监听组件。监听的事件类型可以分为TaskListener、JavaDelegate、Expression、ExecutionListener。ProcessEngineConfigurationImpl持有DelegateInterceptor的某个实例,方便调用handleInvocation。

6. Cache组件

    DbSqlSession中有cache的实现,Activiti基于List和Map来做缓存。如查询时先查缓存,没有则直接查询并放入缓存。

7. 异步执行组件

    Activiti可以执行任务,JobExecutor为启核心类,JobExecutor包含三个主要属性:JobAcquisitionThread,BlockingQueue,ThreadPoolExecutor。方法ProcessEngines在引擎启动时调用JobExecutor.start,JobAcquisitionThread 线程即开始工作,其run方法不断循环执行AcquiredJobs中的job,执行一次后线程等待一定时间直到超时或者JobExecutor.jobWasAdded方法,因为有新任务而被调用。

8. PVM:Process Virtal Machine

    流程虚拟机API暴露了流程虚拟机的POJO核心,流程虚拟机API描述了一个工作流流程必备的组件,这些组件包括:
    PvmProcessDefinition:流程的定义,形象点说就是用户画的那个图。静态含义。
    PvmProcessInstance:流程实例,用户发起的某个PvmProcessDefinition的一个实例,动态含义。
    PvmActivity:流程中的一个节点
    PvmTransition:衔接各个节点之间的路径,形象点说就是图中各个节点之间的连接线。
    PvmEvent:流程执行过程中触发的事件

二. Eclipse插件安装:

    我的Eclipse版本如下:

Activiti7工作流+SpringBoot(上)


    下载离线安装包(在线安装始终失败,应该出于网络限制),地址:http://www.activiti.org/designer/archived/activiti-designer-5.18.0.zip
    离线安装包安装安装依然提示相关包找不到,于是下载另外三个依赖包(org.eclipse.emf.transaction_1.4.0.v20100331-1738.jar、org.eclipse.emf.validation_1.7.0.201306111341.jar、org.eclipse.emf.workspace_1.5.1.v20120328-0001.jar,在Maven仓库可以找到),放到Eclipse的plugin目录下,继续安装,如下:

Activiti7工作流+SpringBoot(上)


    确定后勾选相关选项,完成安装,重启Eclipse,New->Other

Activiti7工作流+SpringBoot(上)


    出现以上标志,则安装完成。

三. 项目搭建

1. 新建Spring Boot工程

    (我的Eclipse已经安装Spring Boot插件)

Activiti7工作流+SpringBoot(上)


    然后Next->Next…->Finish即可,然后改application.properties为application.yml(个人习惯)

Activiti7工作流+SpringBoot(上)

2. 引入Activiti相关依赖

    在pom属性中定义版本号,并添加Activiti相关依赖:

<activiti-dependencies.version>7.0.56</activiti-dependencies.version>
<dependencyManagement>  <dependencies>    <dependency>      <groupId>org.activiti.dependencies</groupId>      <artifactId>activiti-dependencies</artifactId>      <version>${activiti-dependencies.version}</version>      <scope>import</scope>      <type>pom</type>    </dependency>  </dependencies></dependencyManagement>
<dependency>      <groupId>org.activiti</groupId>      <artifactId>activiti-spring-boot-starter</artifactId></dependency>

    由于Activiti默认使用H2数据库,所以需添加H2数据库支持(这里使用此SpringBoot版本默认1.4.197):

<dependency>      <groupId>com.h2database</groupId>      <artifactId>h2</artifactId></dependency>

    出现错误:Missing artifact org.activiti:activiti-spring-boot-starter:jar:7.0.56

Activiti7工作流+SpringBoot(上)


    添加私服仓库地址:

<repositories>        <repository>          <id>alfresco</id>          <name>Activiti Releases</name>          <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>          <releases>            <enabled>true</enabled>          </releases>        </repository></repositories>
Activiti7工作流+SpringBoot(上)


    错误消失。

3. 创建流程图

    在此版本Activiti+SpringBoot,默认加载/processes/目录下流程,于是在resources下新建processes目录,并在目录下new->Other,如下:

Activiti7工作流+SpringBoot(上)


    使用Activiti图编辑工具打开,创建如下流程(创建过程在此不介绍,就是右侧工具栏的运用):

Activiti7工作流+SpringBoot(上)

4. 启动工程

    看日志:

Activiti7工作流+SpringBoot(上)


    从日志中可以看出,流程引擎已经默认创建,并可以看到使用的默认数据源是H2的数据源,我们创建的流程也已经部署。

5. 修改配置

    在正常使用中,一般系统会有自己的数据库,而不会采用默认内存的H2数据库,这里以MySQL为例。修改application.yml。

5.1 添加MySQL依赖

<!--使用mysql数据库,导入mysql驱动--><dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId></dependency>

5.2 修改数据库

spring:  ##数据库连接信息  datasource:    # 数据源配置    url: jdbc:mysql://127.0.0.1:3306/activity?useUnicode=true&characterEncoding=utf-8&useSSL=false    username: root    password: root    driver-class-name: com.mysql.jdbc.Driver    # SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题    xa:      properties:        pinGlobalTxToPhysicalConnection: true        useServerPrepStmts: true

5.3 Activiti相关配置

  # 参考配置https://www.cnblogs.com/liaojie970/p/8857710.html  activiti:    # 自动建表    database-schema: ACTIVITI    database-schema-update: true    history-level: full    db-history-used: true

    注意:
    database-schema-update表示启动时检查数据库表,不存在则创建
    history-level表示哪种情况下使用历史表,这里配置为full表示全部记录历史,方便绘制流程图
    db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示(暂未找到可行方式)

5.4 附上application.yml完整配置:

# 服务配置server:  display-name: actdemo  port: 8085# Spring相关配置spring:##数据库连接信息  datasource:# 数据源配置    url: jdbc:mysql://127.0.0.1:3306/activity?useUnicode=true&characterEncoding=utf-8&useSSL=false    username: root    password: 888    driver-class-name: com.mysql.jdbc.Driver<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"># SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题</span></span></span></span>    xa:      properties:        pinGlobalTxToPhysicalConnection: true        useServerPrepStmts: true  thymeleaf:    mode: HTML    encoding: utf-8# 禁用缓存    cache: false  application:# 注册应用名    name: actdemo  mvc:# 静态资源路径    static-path-pattern: /static/**# 参考配置https://www.cnblogs.com/liaojie970/p/8857710.html  activiti:# 自动建表    database-schema: ACTIVITI    database-schema-update: true    history-level: full    db-history-used: true<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"># SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题</span></span></span></span>

5.5 启动工程

    观察日志,流程引擎已成功加载,并已使用MySQL数据库,如下:

Activiti7工作流+SpringBoot(上)


    再看数据库,已经创建25张表(老版本的Activiti创建表有手动执行SQL和通过调用流程引擎创建两种方式,该版本与SpringBoot整合后,启动默认创建需要的表):

Activiti7工作流+SpringBoot(上)


    注意:
    原SpringBoot工程使用版本2.1.1.RELEASE,启动始终失败,各种错误,后改为2.0.4.RELEASE版本,则启动正常。

6. 编写实例

    本例子使用Thymeleaf做前端页面展示(SpringBoot推荐使用),并创建控制器Controller调用工作流接口与前端交互。

6.1 引入Thymeleaf依赖,(前端使用Thymeleaf的配置已经在application.yml中)

<!-- Thymeleaf依赖 --><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

6.2 创建Controller控制器

    创建启动流程方法,主要代码如下

/**     * <p>启动请假流程</p>     * @return String 流程实例ID     * @author FRH     * @time 2018年12月10日上午11:03:36     * @version 1.0     */    @RequestMapping(value="/start")    @ResponseBody    public String start() {        // xml中定义的ID        String instanceKey = "leaveProcess";        logger.info("开启请假流程...");    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 设置流程参数,开启流程</span></span></span></span>    <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();    map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"A1001"</span></span></span></span>);    map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"busData"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"bus data"</span></span></span></span>);    ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动</span></span></span></span>        logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"启动流程实例成功:{}"</span></span></span></span>, instance);    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}"</span></span></span></span>, instance.getId());    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程定义ID:{}"</span></span></span></span>, instance.getProcessDefinitionId());            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//验证是否启动成功</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//通过查询正在运行的流程实例来判断</span></span></span></span>    ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//根据流程实例ID来查询</span></span></span></span>    <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><ProcessInstance> runningList = processInstanceQuery.processInstanceId(instance.getProcessInstanceId()).list();    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"根据流程ID查询条数:{}"</span></span></span></span>, runningList.size());        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 返回流程ID</span></span></span></span>    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> instance.getId();}    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 设置流程参数,开启流程</span></span></span></span>    <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();    map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"A1001"</span></span></span></span>);    map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"busData"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"bus data"</span></span></span></span>);    ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动</span></span></span></span>        logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"启动流程实例成功:{}"</span></span></span></span>, instance);    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}"</span></span></span></span>, instance.getId());    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程定义ID:{}"</span></span></span></span>, instance.getProcessDefinitionId());            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//验证是否启动成功</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//通过查询正在运行的流程实例来判断</span></span></span></span>    ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//根据流程实例ID来查询</span></span></span></span>    <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><ProcessInstance> runningList = processInstanceQuery.processInstanceId(instance.getProcessInstanceId()).list();    logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"根据流程ID查询条数:{}"</span></span></span></span>, runningList.size());        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 返回流程ID</span></span></span></span>    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> instance.getId();}

6.3 流程跟踪与流程图展示

    Activiti流程图展示,使用流程图生成器,本例生成的流程图在页面使用如下方式展示即可:

<embed src="/demo/showImg?instanceId=5070fd58-f859-11e8-a359-484d7ec5762d" style="display:block;width:1000px;height:450px" />

    引入相关工具包,版本使用默认版本7.0.65

<!-- Activiti生成流程图 --><dependency>  <groupId>org.activiti</groupId>  <artifactId>activiti-image-generator</artifactId></dependency>

    调用输出流程图

/**     * <p>查看当前流程图</p>     * @param instanceId 流程实例     * @param response void 响应     * @author FRH     * @time 2018年12月10日上午11:14:12     * @version 1.0     */    @ResponseBody    @RequestMapping(value="/showImg")    public void showImg(String instanceId, HttpServletResponse response) {        /*         * 参数校验         */        logger.info("查看完整流程图!流程实例ID:{}", instanceId);        if(StringUtils.isBlank(instanceId)) return;    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  获取流程实例     */</span></span></span></span>    HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(processInstance == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {        logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没查询到流程实例!"</span></span></span></span>, instanceId);        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;    }        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 根据流程对象获取流程对象模型</span></span></span></span>    BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  查看已执行的节点集合     *  获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序     */</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 构造历史流程查询</span></span></span></span>    HistoricActivityInstanceQuery historyInstanceQuery = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId);    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 查询历史节点</span></span></span></span>    List<HistoricActivityInstance> historicActivityInstanceList = historyInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(historicActivityInstanceList == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span> || historicActivityInstanceList.size() == <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>) {        logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没有历史节点信息!"</span></span></span></span>, instanceId);        outputImg(response, bpmnModel, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>);        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;    }    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 已执行的节点ID集合(将historicActivityInstanceList中元素的activityId字段取出封装到executedActivityIdList)</span></span></span></span>    List<String> executedActivityIdList = historicActivityInstanceList.stream().map(item -> item.getActivityId()).collect(Collectors.toList());        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  获取流程走过的线     */</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取流程定义</span></span></span></span>    ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());    List<String> flowIds = ActivitiUtils.getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     * 输出图像,并设置高亮     */</span></span></span></span>    outputImg(response, bpmnModel, flowIds, executedActivityIdList);}<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/** * <p>输出图像</p> * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> response 响应实体 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> bpmnModel 图像对象 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> flowIds 已执行的线集合 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> executedActivityIdList void 已执行的节点ID集合 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@author</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FRH * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@time</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 2018年12月10日上午11:23:01 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@version</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 1.0 */</span></span></span></span><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">outputImg</span></span></span></span></span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(HttpServletResponse response, BpmnModel bpmnModel, List<String> flowIds, List<String> executedActivityIdList)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span></span>{    InputStream imageStream = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>;    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">try</span></span></span></span> {        imageStream = processDiagramGenerator.generateDiagram(bpmnModel, executedActivityIdList, flowIds, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"宋体"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"微软雅黑"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"黑体"</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"png"</span></span></span></span>);        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 输出资源内容到相应对象</span></span></span></span>        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">byte</span></span></span></span>[] b = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">byte</span></span></span></span>[<span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1024</span></span></span></span>];        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> len;        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">while</span></span></span></span> ((len = imageStream.read(b, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1024</span></span></span></span>)) != -<span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>) {            response.getOutputStream().write(b, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>, len);        }        response.getOutputStream().flush();    }<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">catch</span></span></span></span>(Exception e) {        logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程图输出异常!"</span></span></span></span>, e);    } <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">finally</span></span></span></span> { <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 流关闭</span></span></span></span>        StreamUtils.closeInputStream(imageStream);    }}    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  获取流程实例     */</span></span></span></span>    HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(processInstance == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {        logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没查询到流程实例!"</span></span></span></span>, instanceId);        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;    }        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 根据流程对象获取流程对象模型</span></span></span></span>    BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  查看已执行的节点集合     *  获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序     */</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 构造历史流程查询</span></span></span></span>    HistoricActivityInstanceQuery historyInstanceQuery = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId);    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 查询历史节点</span></span></span></span>    List<HistoricActivityInstance> historicActivityInstanceList = historyInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(historicActivityInstanceList == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span> || historicActivityInstanceList.size() == <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>) {        logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没有历史节点信息!"</span></span></span></span>, instanceId);        outputImg(response, bpmnModel, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>);        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;    }    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 已执行的节点ID集合(将historicActivityInstanceList中元素的activityId字段取出封装到executedActivityIdList)</span></span></span></span>    List<String> executedActivityIdList = historicActivityInstanceList.stream().map(item -> item.getActivityId()).collect(Collectors.toList());        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     *  获取流程走过的线     */</span></span></span></span>    <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取流程定义</span></span></span></span>    ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());    List<String> flowIds = ActivitiUtils.getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);            <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*     * 输出图像,并设置高亮     */</span></span></span></span>    outputImg(response, bpmnModel, flowIds, executedActivityIdList);}<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/** * <p>输出图像</p> * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> response 响应实体 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> bpmnModel 图像对象 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> flowIds 已执行的线集合 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> executedActivityIdList void 已执行的节点ID集合 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@author</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FRH * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@time</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 2018年12月10日上午11:23:01 * </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@version</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 1.0 */</span></span></span></span><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">outputImg</span></span></span></span></span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(HttpServletResponse response, BpmnModel bpmnModel, List<String> flowIds, List<String> executedActivityIdList)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span></span>{    InputStream imageStream = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>;    <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">try</span></span></span></span> {        imageStream = processDiagramGenerator.generateDiagram(bpmnModel, executedActivityIdList, flowIds, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"宋体"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"微软雅黑"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"黑体"</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"png"</span></span></span></span>);        <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 输出资源内容到相应对象</span></span></span></span>        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">byte</span></span></span></span>[] b = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">byte</span></span></span></span>[<span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1024</span></span></span></span>];        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> len;        <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">while</span></span></span></span> ((len = imageStream.read(b, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1024</span></span></span></span>)) != -<span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>) {            response.getOutputStream().write(b, <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>, len);        }        response.getOutputStream().flush();    }<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">catch</span></span></span></span>(Exception e) {        logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程图输出异常!"</span></span></span></span>, e);    } <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">finally</span></span></span></span> { <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 流关闭</span></span></span></span>        StreamUtils.closeInputStream(imageStream);    }}


如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!学习更多JAVA知识与技巧(获取原文),关注与私信博主(666)

最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!

Activiti7工作流+SpringBoot(上)

TAG:张怡宁简介

其它人还看了:

  广州亚运会时间(亚洲雄风今再起,看看我们记忆中的亚运会!)

  nba新赛季什么时候开始(掘金队加盟NBA后47个赛季首次获得总冠军,NBA不会有人未

  张继科吐槽刘国梁(刘国梁被砂板乒乓球世界冠军虐!张继科魔性狂笑 国胖回瞪

  奥运会足球为什么不火(备战高考!高考语言运用题型之句式转换及表达效果专

  C罗帽子戏法(历史的今天:C罗收获职业生涯首个帽子戏法)

上一条:14年皇马欧冠夺冠阵容(足坛一夜4消息:欧足联颁奖皇马成大赢家,欧冠分组拜仁巴萨相遇)

下一条:热火对魔术(明日最强看点:湖人在飘零中艰难进步,热火战落魄篮网毫不留情)

版权声明本文:《张怡宁简介(Activiti7工作流+SpringBoot(上))》由看球吧原创内容,如需转载请注明原网址:https://www.sxlyhkkj.com。如有不对请联系作者删除谢谢合作

热门栏目

体育资讯

足球录像

篮球录像