流程服务整合

AgileBPM 流程服务依赖一下服务模块
  • SYS 系统服务,主要依赖 消息发送、系统缓存、脚本引擎 等【无需整合,直接依赖该模块】
  • ORG 组织用户服务【可切换】
  • AUTH 鉴权服务, 提供 Rest 资源访问控制,以及获取当前登录用户信息的服务【可切换】
  • BUS-FROM 业务表单,提供业务表单服务【无需整合,直接依赖该模块】

说明

本文介绍对已有的业务系统 进行框架整合的几种解决方案

一、独立部署形式

独立部署形式是让 AgileBPM 作为流程中心或者说门户平台,流程系统以远程调用的方式保存业务系统、调用事件接口

前端整合的形式有:

  1. 多系统切换、子系统模式
    我们可以将 AgileBPM 作为门户平台, 不同的业务系统 作为子系统来管理,用户可以在门户平台中处理所有业务的 流程任务。在子系统中使用已有的业务管理功能

  2. 统一鉴权,整合菜单资源模式
    多个系统间统一风格样式、统一鉴权(单点登录)后,直接整合url资源即可。比如直接将个人办公菜单资源添加至现有系统中,让系统拥有流程办理的功能。

我们推荐使用“自定义表单”来实施流程,即便是已有业务已经开发了表单,依然推荐使用自定义表单,因为自定义表单的实施速度很快,而且表单业务数据可以灵活的用于流程生命周期中。
当然 url表单也可以,但是多系统会存在事物一致问题,比如流程提交后,流程调用 url表单处理器 来远程执行业务数据保存的动作,但是最后流程出现异常,业务数据就无法回滚

整合步骤

切换组织服务实现

如果已有业务系统已经存在组织架构,需要废弃掉 AgileBPM 的组织架构

  1. 移除 ab-org-core 的依赖 0.5h(预计耗时)
  2. 添加 xx-org-adaptor 模块,用来来实现 orgApi 接口,适配已有组织架构数据 3h
  3. 在 xx-org-adaptor 中创建 IGroup,IUser 实现类,UserService,GroupService 实现类(此处可以远程调用,并适配数据 )3d
  4. 移除 AgileBPM 前端 组织管理的功能(屏蔽菜单资源入口) 0.5h
  5. 修改系统中存在的组织、用户对话框,目前有:用户、组织、岗位、角色(自定义对话框支持多数据源) 5h

统一鉴权

鉴权依赖组织API的服务,所以前提必须先保证组织服务的有效性
AgileBPM 使用的 SpringSecurity 如果你们有 CAS 服务器的话,我们推荐使用单点登录来统一鉴权。

如果本身项目在使用jwt的形式,那推荐使用 jwt,AgileBPM 的 token 是存在cookie中,所以建议使用网关或者Nginx 将业务系统与AgileBPM的域名保持一致,这样前端 cookie就可以共享, 然后还需要在后台修改 AgileBPM token解析方式、能让 AgileBPM 正确解析出 用户信息,这样AgileBPM就可以自动免登
具体 token解析以及免登 请参考 JWTAuthenticationFilter.java

注意

鉴权是为了确认用户身份信息,以及判断当前用户是否拥有访问请求资源的权限,如果实现了新的鉴权需要一并实现“获取当前用户信息”的工具类 com.dstz.org.api.context.ICurrentContext,可以参考 LoginContext.java

业务数据持久化方式

  • 若 AgileBPM 与业务系统 【同库】
    没有其他问题

  • 若 【不同库】

  1. 实体使用多数据源形式(多数据源目前支持事物)
  2. 远程业务对象持久化
  3. url表单,然后通过 表单处理器接口远程调用去持久化

难易说明

独立部署,统一鉴权的形式 算是比较常见的整合形式、相对也比较简单。

二、项目集成形式的整合

spring boot 整合

可以参考 agilebpm-spring-boot-samples 案例项目

  1. 依赖 BASE 模块服务【必须】
    提供 动态数据源、ID 生成、agilebpm 相关模块的 mybatis SqlSessionFactory、分页插件等相关服务
    添加依赖

    <dependency>
    <groupId>com.dstz</groupId>
    <artifactId>agilebpm-base-spring-boot-starter</artifactId>
    </dependency>
  2. 依赖系统服务【必须】
    执行 sys 模块相关sql,并添加依赖

<dependency>
<groupId>com.dstz</groupId>
<artifactId>ab-sys-spring-boot-starter</artifactId>
</dependency>
  1. 依赖组织服务【可切换】
    执行 org 模块相关sql并添加依赖
<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>ab-org-core</artifactId>
</dependency>

若切换组织模块实现则需要依赖 org-api 并参考上文“切换组织服务实现” 的描述来 新增 模块 xx-org-adapter

  1. 依赖鉴权模块【可切换】
    auth 模块依赖 org 服务
    注意

    鉴权是为了确认用户身份信息,以及判断当前用户是否拥有访问请求资源链接的权限,如果切换了新的鉴权需要一并实现“获取当前用户信息”的工具类 com.dstz.org.api.context.ICurrentContext,可以参考 LoginContext.java

<dependency>
<groupId>com.dstz</groupId>
<artifactId>ab-security-spring-boot-starter</artifactId>
</dependency>
  1. 依赖业务表单模块【必须】
<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>bus-rest</artifactId>
</dependency>

<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>form-rest</artifactId>
</dependency>
  1. 依赖流程模块
<dependency> 
<groupId>com.dstz</groupId>
<artifactId>ab-bpm-spring-boot-starter</artifactId>
</dependency>
  1. 依赖前端模块
<dependency> 
<groupId>com.dstz</groupId>
<artifactId>agilebpm-ui</artifactId>
</dependency>
  1. 配置
    参考 agilebpm-spring-boot-samples 案例项目的配置文件 进行配置,最后调试启动

访问:http://localhost:8080/agilebpm-ui/index.html 即可请求到 AgileBPM 的前端资源

难易说明

整合需要对常见开源框架有基本的了解,否则不建议您浪费时间

非 springboot 项目整合

AgileBPM 是完全模块化的一个项目,WEB模块仅仅为了整合各个模块,扫描 controller 提供 REST服务,仅此而已。

所以您的整合过程其实是类似WEB模块一样,选择需要的服务模块,通过 spring 配置文件来整合的一个过程
前端的话,由于是前后端分离的项目,所以整合后,前端资源处理下风格样式,就可以完全被您所使用。

目前我们 spring 版本是4.3.17,请确认spring版本,可以在根目录pom中修改

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.framework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

选择依赖

  • 系统服务模块 sys-rest
  • bpm模块依赖 wf-rest,bus-rest,form-rest
  • 组织模块依赖 org-rest,非必须 若不依赖请自行实现orgAPI 即可,参考文中 切换组织服务实现 的介绍
  • 鉴权模块依赖 http-security 非必须 若使用自身鉴权的话请务必实现并注入当前用户信息接口, com.dstz.org.api.context.ICurrentContext

整合开源组件

主要是 base-db.xml,和 sys-core.xml 的整合改造动作

  • 参考base-db.xml 提供 DynamicDataSource(AbstractRoutingDataSource)的默认数据源 dataSourceDefault
  • 为数据源提供事物 参考app-tx.xml 相关配置
  • 参考base-db.xml 对系统的mybatis进行扫描,如果您系统持久层不是 mybatis 则按照 base-db.xml 进行配置,并配置 pagehelper
  • 参考 sys-core.xml 对 redis,quartz 进行整合

难易说明

您可能需要比较了解 AgileBPM 系统模块,并拥有较强的框架整合能力,否则建议您寻找群主帮忙整合

三、微服务版本集成

微服务版本简介

微服务版本依赖 springboot 版本的starters 目前有 三个微服务工程

  • gateway Zuul 网关工程 : 用于路由转发,请求鉴权
  • bpm-service 流程微服务: 流程以及相关的表单、业务对象、系统功能等服务
  • org-service 组织微服务: 组织架构,为网关、流程提供 组织服务

除了三个微服务工程外 还有 以下几个基础模块

  • commons-web: AgileBPM微服务项目公共模块,提供基础的依赖
  • commons-adapter-client: 用户服务、当前会话服务客户端, bpm-service 依赖该 client
  • commons-org-adapter-server: 适配用户微服务 服务端
  • commons-session-adapter-api: 用户会话服务的接口定义
  • commons-session-adapter-server: 提供当前用户会话服务
  • commons-session-resolve: 用来解析会话编号

微服务架构图

微服务整合 AgileBPM

在微服务的整合中,各个业务库独立自治,整合业务系统基本都不允许 “数据源操作”的形式对业务数据进行保存,所以这时候我们 远程业务对象持久化 功能就派上用处了,除了业务系统整合,您可以需要整合用户服务、接入网关鉴权等工作。

微服务模块依赖关系

整合前请务必先搞清楚 AgileBPM 微服务各个模块的功能与关系

整合步骤

  1. 配置 bpm-service,org-service,gateway 的 eureka地址,配置 bpm-service ,org-service 数据库等地址
  2. 若不使用 AgileBPM 的网关 则需要参考 gateway 工程 配置文件 来配置 路由规则,并自行控制鉴权
  3. 若已有组织架构,则不需要 org-service 工程,则需要进行组织服务、会话服务的切换

最后启动相关微服务即可

微服务切换组织实现

组织、会话服务的切换有两种方式:1.侵入试,直接重新实现 commons-adapter-client 模块,2.按以下步骤进行切换

  1. “业务系统用户中心” 依赖 agileBPM 的 commons-org-adapter-server 模块

  2. 由于 commons-org-adapter-server 依赖 GroupService,UserService 两个接口的实现类, 所以 “业务系统用户中心” 的 spring 环境中需要注入该接口实现类

  3. “业务系统用户中心” 依赖 commons-session-adapter-server 模块

  4. commons-session-adapter-server 依赖 IWebSessionService 实现类,所以 “业务系统用户中心” 的 spring 容器中必须有该接口的实现类,用于提供 “用户票据解析” 服务

  5. 配置用户登录票据的位置

    commons-session-resolve 会对请求中的票据进行提取,配置如下

    ab:
    session-id:
    resolve-type: COOKIE
    resolve-key: JSESSIONID

    resolve-type: 默认值为cookie,支持从head 获取
    resolve-key : 默认为 JSESSIONID,可以根据具体情况设置具体key 的值

  6. 修改系统中存在的组织、用户对话框,目前有:用户、组织、岗位、角色(自定义对话框支持多数据源、接口形式获取数据)

难易说明

若本身已经是 springcloud 微服务架构 推荐该种整合方案,整合相对比较容易

远程业务对象持久化

远程业务对象持久化是在不允许使用多数据源操作业务库的场景时使用,他是针对微服务架构量身定制的

业务数据持久化支持 三种方式
  • 实体表多数据源形式
  • url表单的表单处理器(接口形式)
  • 远程业务对象持久化

本段就着重介绍 业务对象远程持久化功能

AgileBPM 业务对象能适应任意数据结构,业务对象可以直接配置成 与远程接口 java bean 相同的数据结构,这样可以利用 模型驱动 以 DTO 为入参接受请求数据

在 业务对象管理 - 编辑 - 持久化方式中 可以配置 持久化方式

  • Feign 接口 形式: 以Feign接口形式持久
  • REST 接口地址: 配置远程服务器的 rest 地址
远程业务对象持久化 业务交互图
远程业务对象接口说明

远程业务对象持久化,每个业务对象需要实现三个接口

获取数据接口
POST  ../../load

请求入参

Type Name Description Schema
FormData busKey
optional
业务对象KEY string
FormData mainId
optional
主表ID string

返回结果

HTTP Code Description Schema
200 OK ResultMsg<RemoteEntityData>
保存数据接口
POST  ../../save

请求入参

Type Name Description Schema
Body RemoteEntityData remoteEntityData RemoteEntityData

T 为具体业务对象、在业务系统方 直接模型驱动 转为具体的 java 对象

返回结果
会返回 mainId

HTTP Code Description Schema
200 OK ResultMsg«string»
删除数据接口
POST  ../../remove

请求入参

Type Name Description Schema
FormData busKey
optional
业务对象KEY string
FormData mainId
optional
主表ID string

返回操作结果

HTTP Code Description Schema
200 OK ResultMsg

  • RemoteEntityData 远程业务对象持久化 DTO
/**
* 远程业务数据 DTO
*/
public class RemoteBusinessData<T> implements java.io.Serializable {
private static final long serialVersionUID = -801014933612371616L;
/**
* 业务对象KEY
*/
private String busKey;

/**
* 业务对象 JSON,
* 在 agilebpm T 为业务对象的 JSON,
* 在 业务系统 T 可以直接利用模型驱动转换成 实体对象 eg:User
*/
private T data;


//非必须 流程key 若为流程持久化业务对象 则含该值
private String flowKey;
//非必须 流程实例ID 若为流程持久化业务对象 则含该值
private String instanceId;
//非必须 流程任务节点 若为任务提交业务对象 则含该值
private String nodeId;