注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: identityService.setAuthenticatedUserId(initUserId); processInstance = runtimeService.startProcessInstanceByKey(流程ID, 业务Key, 变量map); or startProcessInstance…
注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: identityService.setAuthenticatedUserId(initUserId); processInstance = runtimeService.startProcessInstanceByKey(流程ID, 业务Key, 变量map); or startProcessInstance…
1.如何实现审核的上级获取(任务逐级审批) 这个是必备功能,通过Spring的注入+Activiti表达式可以很容易解决. 可参考: http://blog.csdn.net/sunxing007/article/details/8491552 http://linhongyu.blog.51cto.com/6373370/1656596 2.如何设置流程发起人,并动态在其他任务中使用 通过变量,在启动的时候设置. activiti里设置流程发起人的功能很绕. activiti 指定发起人,并作…
流程的人员参与角色: Assignee :签收者(即待办人) Candidate:候选人 Owner:拥有者 Starter:启动者 participant:参与者,包含查阅 流程变量的类型: String Date Double Integer Long Null Short jpa-entity Boolean Bytes serializable(可序列化) 自定义type(根据你自身配置) CustomVariableType 1.控制台的主要功能 Tasks: 任务管理功能. 这里,如…
第一步: 在mysql中创建数据库名字叫 'activiti' 执行D:\activiti-5.21.0\database\create下的脚本 第二步: 打开=> apache-tomcat/webapps/activiti-explorer/WEB-INF/classes/ db.properties 修改配置文件 db.properties db=activiti jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localho…
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring-activiti-webapphttp://www.cnblogs.com/hongwz/p/5548473.html Spring典型配置 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:conte…
事件机制从Activiti 5.15开始引入,这非常棒,他可以让你实现委托. 可以通过配置添加事件监听器,也可以通过Runtime API加入注册事件. 所有的事件参数子类型都来自org.activiti.engine.delegate.event.ActivitiEvent 包含的信息: type executionId processInstanceId processDefinitionId 事件监听 其中,JOB_EXECUTION_SUCCESS 和JOB_EXECUTION_FAIL…
下载地址: http://activiti.org/download.html 源码: https://github.com/Activiti/Activiti 环境准备(检查项): JDK 1.7 + JAVA_HOME :java -version 下载 Eclipse Indigo + 拷贝activiti-explorer.war 到 Tomcat/webapps目录 运行Tomcat/bin目录startup.bat or startup.sh 不修改Tomcat http端口情况下访…
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门户系统(使用portlet规范技术实现)运行: 先实现一个JSP + Servlet版的通用流程处理,将来迁移到Portlet 迁移工作将保留大量的前后端代码,仅需要改动少量的注解. 考虑到Liferay的客户端体系是bootstrap+jQuery(对移动端的支持非常好),JSP的实现也用了这两者…
Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() init() 在Liferay容器部署portlet时,启动portlet实例化 init有两个写法: public void init() throws PortletException public void init(PortletConfig config) throws PortletEx…
hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为系统服务挂钩(Liferay Service Hook),还有其他类型的hook... Liferay6.2 时的hook开发比较有限,而在Liferay7则大为不同,OSGi services的彻底改进至Liferay的底层模型框架,使得Liferay可以支持更多的定制扩展!OSGi plugin…
在实际的BPM集成开发过程中,Liferay和Activiti这两个异构的系统之间,用户.组的同步需求非常重要,用来实现签收组的概念,比如指定签收组.会签.抢签都需要用到. Activiti可以通过自定义实现SessionFactory,实现customUserManager和customRoleManager的方式集成第三方的用户关系. 这里我介绍一个方法,可以借助Liferay的实体监听器来做用户.组.用户-组成员关系的三种同步. 其实实现原理非常简单 用户组的同步,就是实现 BaseMod…
处理依赖关系 集成Activiti之前,必须搞清楚其中的依赖关系,才能在Gradle里进行配置. 依赖关系: 例如,其中activiti-engine依赖于activiti-bpmn-converter,而activiti-bpmn-converter又依赖于activiti-bpmn-model 那么这以下的引用都是要设置的,缺一不可,否则portlet会无法注入进OSGi容器 org.activiti:activiti-engine:jar:5.xx.0+- org.activiti:act…
开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RETURN_MESSAGE}</h3> <h2><liferay-ui:message key="Deploy"/></h2> <portlet:actionURL var="uploadURL" name="…
写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原理是继承实现org.activiti.engine.impl.interceptor.SessionFactory 首先继承用户实例,用liferay的用户模型 import org.activiti.engine.impl.persistence.entity.UserEntity; public…
Liferay最大的问题是BPM弱,如果做企业开发,BPM必不可少,所以直入主题,做个BPMN2入门. 本文参考地址:http://activiti.org/userguide/index.html#bpmnConstructs BPMN 2.0中的重要概念: Events 事件 Sequence Flow 顺序流 Gateways 网关 Tasks 任务 Sub-Processes and Call Activities 子流程 Transactions and Concurrency 事务并…
开发顺序: 实战任务1,开发BPM管理后台(用于在Liferay管理中心管理Activiti模型上传) 一个熟悉Portlet操作的项目,为开发打好基础. http://www.cnblogs.com/starcrm/p/6184721.html 实战任务2,开发BPM管理后台:流程列表清单Portlet 万里长征第一步,非常关键. http://www.cnblogs.com/starcrm/p/6177844.html 实战任务3,开发BPM待办已办任务清单Portlet 实战任务4,开发B…
首先增加两个Portlet,分别用于待办处理.流程启动.待办是别人发起的流程,流到自己这里的流程:流程启动用于发起新的流程. 程序文件放置于 在ACtivit中待办概念分两种,1是指派给你的,专门的指派流程节点:2是在候选组中,符合抢签权限的人.在代码中进行了合并: package com.lifiti.portlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputSt…
第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd"> <hook> <portal-properties>portal.properties</…
官网上的教材说实话实在精简不清晰. https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/creating-an-mvc-portlet 版本7的Action机制换了: https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/mvc-action-command 上边的例子有不少java代码直接写在jsp里,感觉有点不舒服,要想想替代方法. 关于新建Por…
Liferay内置的工作流是企业版的功能,虽然简单粗糙,但依然不支持社区版.既然要用更强大的Activiti来替代它,那就非常有必要学习一下内置工作流的一些思想,以便借鉴. 它的特点: 实体的工作流操作可以通过service layer进行集成: 需要添加4个额外的字段来跟踪流程状态: 通过Service Builder来建立字段,然后更新service layer: 视图层UI可以显示实体的工作流状态. 实体集成逻辑 比如,发布一个实体类的工作流支持,首先添加注解: @Component( p…
Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签.分类.评论.星标等功能.它可以关联任意的门户内容,文本.Int.Image.documents.blog entries, bookmarks,或者任何您自己定义的内容. 这带来门户的一致关联性,非常有益. Asset框架主要有下列功能: 1.关联Tag标签到自定义的内容类型,可以创建或关联已存在的…
设计目的: 每个流程表单涉及不同的表单变量.比如请假流程有3个任务节点,分别是 Task1:开始流程,填写请假人.请假原因.请假开始时间.请假结束时间: Task2:上级审批,填写是否同意,审批意见: Task3:HR审批,填写是否同意,审批意见: 这里不处理消假: 那么各任务周期的变量分别是: Task1:initiator.reason.startDatetime.endDatetime; Task2:  isApprove.remark: Task3:isApprove.remark: 在…
进入liferay v7.0,官方推荐使用Gradle进行依赖管理和发布,所以必须知道Gradle的用法,网上资料很多,不赘述 只写依赖管理的分类 一般用外部仓库依赖,也可以用本地文件依赖(依赖本地jar包),如: 本地文件依赖 dependencies { //单文件依赖 compile files('libs/activiti-engine-5.21.0.jar') //某文件夹的全部依赖 compile fileTree(dir: 'libs', include: '*.jar') 其中l…
Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Service Builder那么繁琐, 实现的具体技术实际上是列转行,其中ExpandoValue有点像Activiti的act_ru_variable 主要有4种接口,分别是表\行\列\值 ExpandoTableLocalServiceUtil ExpandoRowLocalServiceUtil Ex…
在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方法前定义: @GET @Path("/ActionXXX") @Produces("text/plain") 例子:得到注册用户 import com.liferay.portal.kernel.model.User; import com.liferay.portal…
Model Listeners实现ModelListener接口,用于持久化时的AOP处理 一些使用场景: Audit Listener: 在一个独立而分离的数据库,做信息更新的审计: Cache Clearing Listener: 缓存清除时做的额外定制处理: Validation Listener: 实体的验证 Entity Update Listener: 实体的更新处理 在一个实体模型上可以有多个侦听器,并且无法控制他们运行的顺序. Liferay7中你只需要处理2件事情,比6.2要简…
Liferay Message Bus提供了松耦合的消息发送接收机制(生产和消费的设计模式),用于本地服务,不支持远程服务,支持集群. 主要用途: 两个或多个插件之间的通讯. 在事件中发送搜索索引,比如传递工作流的实例索引. 发送订阅邮件或系统消息,比如在工作流中的待办到达时,给用户发送提醒消息. 定时任务消息发送,比如在工作流中的定时任务启动时,给用户发送提醒消息. 运行异步过程 主要分几个组件 Message Bus: 管理消息发送: Destinations: 目标终端地址,用于注册监听者…
Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and Spring集成,缓存处理,动态查询等特性.令人惊讶的是,Liferay所有的持久化代码.Servie接口代码都是由Service Builder自动生成的,可见其自动化程度之高. 注意:Liferay的数据持久化开发不是必需用Service Builder,你可以直接用JDBC.JPA等任何技术…
用户 . 站点 . 组织架构 . 角色 . 用户组分别是:Users. Site. Organization. Role. UserGroups Users 用户是Liferay portal中的关键实体,分别和站点 / 组织架构 / 用户组相互关联: 用户是组织架构的一部分: 一个用户可以通过访问权限访问多个站点: 用户包含的权限有3种作用域: Site Specific Roles:站点级别 Organization specific Roles:组织架构级别 Regular (Portal…