我明天去见网友。我怕是防城港的传销太可怕了?怎么预防?

 .1 ProcessEngine
1)&在Activiti中最核心的类,其他的类都是由他而来。
2)&产生方式:
在前面看到了两种创建ProcessEngine(流程引擎)的方式,而这里要简化很多,调用的方法时会自动加载下名为文件。
3)&可以产生RepositoryService
4)&可以产生RuntimeService
5)&可以产生TaskService
各个Service的作用:
RepositoryService
管理流程定义
RuntimeService
执行管理,包括启动、推进、删除流程实例等操作
TaskService
HistoryService
历史管理(执行完的数据的管理)
IdentityService
组织机构管理
FormService
一个可选服务,任务表单管理
ManagerService
使用Activiti的定制环境中基本上不会用到。 它可以查询数据库的表
和表的元数据。另外,它提供了查询和管理异步操作的功能。
是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:文件和流程图片。
1)&产生方式
2)&可以产生DeploymentBuilder,用来定义流程部署的相关参数
3)&删除流程定义
是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。
是activiti的任务服务类。可以从这个类中获取任务的信息。
是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
流程定义类。可以从这里获得资源文件等。
代表流程定义的执行实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。
Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,就是同。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。
如图为ProcessInstance的源代码:
从源代码中可以看出ProcessInstance就是Execution。但在现实意义上有所区别:
在单线流程中,如上图的贷款流程,ProcessInstance与Execution是一致的。
这个例子有一个特点:wire money(汇钱)和archive(存档)是并发执行的。 这个时候,总线路代表ProcessInstance,而分线路中每个活动代表Execution。
* 一个流程中,执行对象可以存在多个,但是流程实例只能有一个。
* 当流程按照规则只执行一次的时候,那么流程实例就是执行对象。
阅读(...) 评论()Activiti5(1)
可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:
Fatal &error &warn &info &debug &trace
一、部署流程定义
1,在工程项目下创建源码文件夹process
2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)
3,在test1.bpmn文件定义请假流程或者是报销流程
4,测试代码
public class ActivitiAPI {
//首先获得默认的流程引擎,在创建时会自动加载classpath下得activiti.cfg.xml或者是activiti-context.xml
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
* 1.部署流程定义
* 会在三张表中产生数据:
* act_ge_bytearray 产生两条数据
*act_re_deployment 产生一条数据
*act_re_procdef 产生一条数据
* 方式一:读取单个的流程定义文件
* 方式二:读取zip压缩文件
public void deploy() {
// 获取仓库服务并创建发布配置对象
DeploymentBuilder deploymentBuilder = processEngine
.getRepositoryService().createDeployment();
// 方式一:设置发布信息
deploymentBuilder.name(&请假流程部署&);//添加部署规则的名称
// 读取单个的流程定义文件
deploymentBuilder.addClasspathResource(&test1.bpmn&);
// 添加规则图片
不添加会自动产生一个图片不推荐
deploymentBuilder.addClasspathResource(&test1.png&);
Deployment
deployment =deploymentBuilder.deploy();
// 方式二:读取zip压缩文件
/*ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
.getClassLoader().getResourceAsStream(&process.zip&));
deploymentBuilder.addZipInputStream(zipInputStream);
Deployment deployment =deploymentBuilder.deploy();*/
部署流程定义步骤:
  1) & & 首先获得默认的流程引擎getDefaultProcessEngine(),在创建时会自动加载classpath下得activiti-context.xml或者是activiti.cfg.xml
  2)&&&& 通过流程引擎获取了一个RepositoryService对象也就是仓库服务对象
  3) & & 由仓库的服务对象创建一个部署对象配置对象,用来封装部署环境的相关配置。
  4) & & 这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。
  5)&&&& 部署,也是往数据库中存储流程定义的过程。
  6)&&&& 这一步在数据库中将操作三张表:
    a)&&&& act_re_deployment
&&     存放流程定义的显示名和部署时间,每部署一次增加一条记录
    b)&&&& act_re_procdef
&&     存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
    c)&&&& act_ge_bytearray
&&     存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
二、查询流程定义
* 查询流程定义列表
public void queryProcessDefinition(){
// 流程定义查询对象,用于查询表act_re_procdef,添加条件查询
ProcessDefinitionQuery query = processEngine.getRepositoryService()
.createProcessDefinitionQuery();
// 添加过滤条件
query.processDefinitionKey(&bxlc&);
// 添加排序条件降序排序
query.orderByProcessDefinitionVersion().desc();
// 添加分页查询
query.listPage(0, 10);
List&ProcessDefinition& list =query.list();
for(ProcessDefinition pd : list) {
System.out.println(pd.getName()+ && + pd.getId());
流程定义查询步骤:
 1)&&&& 因为流程定义的信息存放在仓库中,所以应该获取RepositoryService。
  2) & & 创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询过滤参数
  3) & & 调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表
  4)&&&& 由运行结果可以看出:
    a)&&&& Key和Name的值为:bpmn文件process节点的id和name的属性值
    b)&&&& key属性被用来区别不同的流程定义。
    c)&&&& 带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1
 d)&&&& Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字
    e)&&&& 重复部署一次,deploymentId的值以一定的形式变化
三、删除流程定义
* 删除流程定义(通过删除部署信息达到删除流程定义的目的)
*删除act_re_procdef和act_re_deployment表中的一条记录
public void delDeployment() throwsException {
// 获取仓库服务对象
RepositoryService repositoryService =processEngine.getRepositoryService();
// 删除发布信息
String deploymentId = &1&;
// 普通删除,如果当前规则下有正在执行的流程,则抛异常
repositoryService.deleteDeployment(deploymentId);
// 级联删除,会删除和当前规则相关的所有信息,包括历史
repositoryService.deleteDeployment(deploymentId, true);
}四、启动流程实例
什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例
/**根据流程定义的id启动一个流程实例,这个流程定义的Id来自act_re_procdef
* 启动一次流程实例act_ru_execution表增加一条数据
public void startProcessInstance() {
//获取流程定义ID
*String processDefinitionId = &qjlc:9:1204&; ProcessInstance
*processInstance =
*processEngine.getRuntimeService().startProcessInstanceById
* (processDefinitionId );System.out.println(processInstance.getId());
//自动选择最新版本的流程定义启动流程实例建议使用key来启动
String processDefinitionKey = &qjlc&;
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId());
}五、查询流程实例列表
* 查询流程实例列表,查询act_ru_execution表
public void queryProcessInstance(){
//流程实例查询对象,查询act_ru_execution表
ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
query.processDefinitionKey(&qjlc&);
query.orderByProcessInstanceId().desc();
query.listPage(0, 2);
List&ProcessInstance& list =query.list();
for(ProcessInstance pi : list) {
System.out.println(pi.getId()+ & & + pi.getActivityId());
}六、结束流程实例
* 结束流程实例,操作的表
* 执行表:act_ru_execution(删除一条数据)
* 任务表 act_ru_task(删除一条数据)
public void deleteProcessInstance(){
String processInstanceId = &1601&;
processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, &我愿意&);
}七、查询部署信息
* 查询部署列表(同一个流程定义因为修改会进行多次的部署,版本号不一样version会增加,每次部署act_re_deployment表增加一条记录)
public void queryDeployment() {
// 部署查询对象,查询表act_re_deployment
DeploymentQuery query = processEngine.getRepositoryService()
.createDeploymentQuery();
List&Deployment& list =query.list();
for (Deploymentdeployment : list) {
String id = deployment.getId();
System.out.println(id);
}八、删除部署信息
* 删除部署信息,删除act_re_procdef和act_re_deployment表中的一条记录
public void deleteDeployment() {
String deploymentId = &101&;
// processEngine.getRepositoryService().deleteDeployment(deploymentId);
//true代表删除级联关联表信息
processEngine.getRepositoryService().deleteDeployment(deploymentId,
}九、查询一次流程部署对应的文件名称(bpmn,png)和输入流
* 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn,png)
* @throws Exception
public void queryProcessFile() throws Exception {
String deploymentId = &101&;
List&String& names = processEngine.getRepositoryService()
.getDeploymentResourceNames(deploymentId);
for (String name :names) {
System.out.println(name);
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId,name);
// 将文件保存到本地磁盘
* OutputStream out = new FileOutputStream(newFile(&d:\\& + name));
* byte[] b = new byte[1024]; int len= 0; while((len =
* in.read(b))!=-1) { out.write(b, 0, len);} out.close();
//使用mons.io.FileUtils的工具类
FileUtils.copyInputStreamToFile(in,new File(&d:\\& + name));
in.close();
}十、获取流程定义图标(png文件)
* 获得png文件的输入流
* @throws Exception
public void getPng() throws Exception {
String processDefinitionId = &qjlc:9:1204&;
InputStream pngInputStream = processEngine.getRepositoryService()
.getProcessDiagram(processDefinitionId);
FileUtils.copyInputStreamToFile(pngInputStream,new File(&d:\\my.png&));
}十一、&&&&&&查询个人任务列表
* 查询任务列表查询act_ru_task表
public void queryTask() {
TaskQuery query= processEngine.getTaskService().createTaskQuery();
String assignee = &张三&;
query.taskAssignee(assignee);
query.orderByTaskCreateTime().desc();
List&Task& list = query.list();
for (Task task :list) {
System.out.println(task.getId()+ & & + task.getName());
}十二、&&&&&&办理任务
* 办理任务
public void completeTask(){
String taskId= &404&;
processEngine.getTaskService().complete(taskId);
}十三、&&&&&&直接将流程想下执行一步管理员用户拥有该权限
* 直接将流程向下执行一步act_ru_task表增加一条数据,直接跳过一步
public void signal(){
String executionId = &2701&;//流程实例id
processEngine.getRuntimeService().signal(executionId);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19693次
排名:千里之外
原创:33篇
(1)(4)(5)(6)(8)(3)(3)(3)(1)(1)(1)(2)(2)activiti api总结_读书人
activiti api总结
&来源:读书人网&【读书人网():综合教育门户网站】
activiti api小结?FormServiceActiviti表单引擎产生的用户任务表单服务HistoryService?得到已完成的工作流
activiti api小结 ?FormServiceActiviti表单引擎产生的用户任务表单服务HistoryService?得到已完成的工作流实例信息IdentityService认证服务,在工作流执行过程中进行用户查询、认证等操作TaskService?任务服务,可以根据用户创建与查询所分配的任务等等RepositoryService用于发布,查询,删除,获取工作流定义RuntimeService开始和查询工作流实例,流程变量可以获取和设置????????典型API详解:1 RuntimService ??1)startProcessInstanceByKey 开始一个新的以工作流实例,注意bykey实际上指的是定义的工作流Id,附加了一个map信息Map variableMap = new HashMap();variableMap.put("isbn";, "123456";);ProcessInstance processInstance =runtimeService.startProcessInstanceByKey("bookorder";, variableMap);?2 )createProcessInstanceQuery() 查询工作量实例List instanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey("bookorder").list();
//返回所有以bookorder为id的实例,若是processDefinitionId则只返回在运行的实例?2 TaskServieTaskServie最重要的是claim与complete两个方法?1) claim调用claim的用户将变成该任务的所有人,其它用户将不能claim与complete该任务?2) complete将会使完成任务,使流程向下进行??? 上代码:Task task = taskService.newTask();task.setName("Test task");task.setPriority(100);taskService.saveTask(task);assertNull(task.getAssignee()); //创建TaskIdentityService identityService =activitiRule.getIdentityService();User user = identityService.newUser("JohnDoe");identityService.saveUser(user);//创建用户taskService.addCandidateUser(task.getId(), "JohnDoe");task = taskService.createTaskQuery().taskCandidateUser("JohnDoe").singleResult();assertNotNull(task); // 将用户与任务关联assertEquals("Test task", task.getName());assertNull(task.getAssignee());taskService.claim(task.getId(), "JohnDoe");//分配任务task = taskService.createTaskQuery().taskAssignee("JohnDoe").singleResult();assertEquals("JohnDoe", task.getAssignee());plete(task.getId());//完成任务task = taskService.createTaskQuery().taskAssignee("JohnDoe").singleResult();assertNull(task);?3) 查询,如下:Task task = taskService.createTaskQuery().taskCandidateGroup("sales") .singleResult();singleResult() //查询sales组下所分配的任务,因为在该任务中唯一,因此可用返回唯一任务?? ?权限需要在工作流中定义&userTask id="usertask1"name="Complete order"activiti:candidateGroups="sales"&
//定义了sales组&documentation&book order user task&/documentation&&/userTask&??Activiti入门教程8(玩转Task任务API) - 综合当前位置:& &&&Activiti入门教程8(玩转Task任务API)Activiti入门教程8(玩转Task任务API)&&网友分享于:&&浏览:0次Activiti入门教程八(玩转Task任务API)&
& & &经过几年的学习,现在才感觉,了解源码是多么的重要,甚至如今火热的培训班的老师也是这样过来的吧!一点一点的分析源码,再加上一点一点的思考和总结,才能够对知识了解的那么深刻吧!原来学习就是如此的简单。
& & &废话不多说了,本篇博客,来详解一下Activiti中有关Task任务的API。
& & &任务的增删改
& & &在Activiti中有关任务对象的增删改与之前讲解的用户或者用户组的增删改,都是一样的,看一下用到的方法
&&Task newTask();
& Task newTask(String taskId);
& void saveTask(Task task);
& void deleteTask(String taskId);
& void deleteTasks(Collection&String& taskIds);
& void deleteTask(String taskId, boolean cascade);
& void deleteTasks(Collection&String& taskIds, boolean cascade);
& void deleteTask(String taskId, String deleteReason);
& void deleteTasks(Collection&String& taskIds, String deleteReason);
& & &基本上TaskService接口中关于任务的增删改的就这么多,英文差不多的就可以看懂上面方法是什么意思了,就不多解释了,直接来一个Demo尝一下鲜吧
&span style=&font-family:Comic Sans MS;font-size:18&&public class DeleteTask {
public static void main(String[] args) {
// 创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//获取任务服务组件
TaskService taskService = engine.getTaskService();
// 保存若干个Task
for (int i = 1; i & 10; i++) {
saveTask(taskService, String.valueOf(i));
// 删除task(不包括历史数据和子任务)
taskService.deleteTask(&1&);
// 删除task(包括历史数据和子任务)
taskService.deleteTask(&2&, true);
// 删除多个task(不包括历史数据和子任务)
List&String& ids = new ArrayList&String&();
ids.add(&3&);
ids.add(&4&);
taskService.deleteTasks(ids);
//删除多个task(包括历史数据和子任务)
ids = new ArrayList&String&();
ids.add(&5&);
ids.add(&6&);
taskService.deleteTasks(ids, true);
// 再删除ID为3的task,此时3的历史数据也会被删除(如果有的话)
taskService.deleteTask(&3&, true);
//保存一个task
static void saveTask(TaskService taskService, String id) {
Task task1 = taskService.newTask(id);
taskService.saveTask(task1);
& & &任务权限的设置&
& & &经过上面那些方法一折腾,任务总算是创建出来了,那么任务最终还是人来做的哈,如何来分配任务呢?看一下又有什么好玩的方法
//根据任务ID和用户ID,然后绑定到一块
void addCandidateUser(String taskId, String userId);
//把任务ID和用户组绑定到一块
&void addCandidateGroup(String taskId, String groupId);
//不仅绑定到一块,并设置绑定的类型
&void addUserIdentityLink(String taskId, String userId, String identityLinkType);
&void addGroupIdentityLink(String taskId, String groupId, String identityLinkType);
//删除操作
&void deleteCandidateUser(String taskId, String userId);
&void deleteCandidateGroup(String taskId, String groupId);
&void deleteUserIdentityLink(String taskId, String userId, String identityLinkType);
&void deleteGroupIdentityLink(String taskId, String groupId, String identityLinkType);
//根据任务id和用户id设置任务受理人
void setAssignee(String taskId, String userId);
//根据用户id和任务id设置任务持有人
&void setOwner(String taskId, String userId);
& & &上面就是TaskService中有关任务分配的所有方法,看一眼,有木有感觉很简单呢?确实是这样,在分享一个demo来尝尝鲜吧!
&span style=&font-family:Comic Sans MS;font-size:18&&public class SetOwner {
public static void main(String[] args) {
// 获取流程引擎实例
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 获取身份服务组件
IdentityService identityService = engine.getIdentityService();
// 新建用户
User user = creatUser(identityService, &user1&, &张三&, &last&,
&&, &123&);
// 获取任务服务组件
TaskService taskService = engine.getTaskService();
// 保存一个Task
Task task1 = taskService.newTask(&task1 &);
task1.setName(&申请任务&);
taskService.saveTask(task1);
// 设置任务持有人
taskService.setOwner(task1.getId(), user.getId());
System.out
.println(&用户张三持有任务数量:&
+ taskService.createTaskQuery().taskOwner(user.getId())
.count());
// 创建用户方法
static User creatUser(IdentityService identityService, String id,
String first, String last, String email, String passwd) {
// 使用newUser方法创建User实例
User user = identityService.newUser(id);
// 设置用户的各个属性
user.setFirstName(first);
user.setLastName(last);
user.setEmail(email);
user.setPassword(passwd);
// 使用saveUser方法保存用户
identityService.saveUser(user);
return identityService.createUserQuery().userId(id).singleResult();
& & &任务参数
& &在任务分配或者传递过程中,避免不了需要一些参数的传递,比如我们请假的时候,有请假人和请假天数吧!在Activiti中,参数类型分为流程参数和任务参数。老规矩,看一下用到的方法吧!
&void setVariable(String taskId, String variableName, Object value);
&void setVariables(String taskId, Map&String, ? extends Object& variables);
&void setVariableLocal(String taskId, String variableName, Object value);
&void setVariablesLocal(String taskId, Map&String, ? extends Object& variables);
&Object getVariable(String taskId, String variableName);
&boolean hasVariable(String taskId, String variableName);
&Object getVariableLocal(String taskId, String variableName);
&boolean hasVariableLocal(String taskId, String variableName);
&Map&String, Object& getVariables(String taskId);
&Map&String, Object& getVariablesLocal(String taskId);
&Map&String, Object& getVariables(String taskId, Collection&String& variableNames);
&Map&String, Object& getVariablesLocal(String taskId, Collection&String& variableNames);
&void removeVariable(String taskId, String variableName);
&void removeVariableLocal(String taskId, String variableName);
&void removeVariables(String taskId, Collection&String& variableNames);
&void removeVariablesLocal(String taskId, Collection&String& variableNames);
& & &哇塞,满满的全是正能量哈,这么多,Activiti封装的太贴心了,在这里需要补充一点知识。在Activiti中设置的参数是有作用域概念的,上面方法中没有带Local的,代表的是全局的作用域,带Local的表明的是当前任务的作用域。
& & &下面就通过实战来了解一下吧
&span style=&font-family:Comic Sans MS;font-size:18&&public class LocalVariable {
public static void main(String[] args) {
// 获取流程引擎实例
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 获取任务服务组件
TaskService taskService = engine.getTaskService();
// 获取运行服务组件
RuntimeService runtimeService = engine.getRuntimeService();
// 流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource(&bpmn/vacation.bpmn&).deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 分别调用setVariable和setVariableLocal方法
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
taskService.setVariable(task.getId(), &days&, 10);
taskService.setVariableLocal(task.getId(), &target&, &欧洲&);
// 获取参数
Object data1 = taskService.getVariable(task.getId(), &days&);
System.out.println(&获取休假天数:& + data1);
Object data2 = taskService.getVariable(task.getId(), &target&);
System.out.println(&获取目的地: & + data2);
// 获取参数
Object data3 = taskService.getVariableLocal(task.getId(), &days&);
System.out.println(&使用getVariableLocal方法获取天数:& + data3);
& &区别就不再多说看,运行下上面例子,结果自然而知
& & &任务附件管理
& & &在一些流程中,有时候也会附带一些附件,在Activiti中也为我们封装好了上传附件的API
&Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String &attachmentName, String attachmentDescription, InputStream content);
&Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String &attachmentName, String attachmentDescription, String url);
&void saveAttachment(Attachment attachment);
&Attachment getAttachment(String attachmentId);
&InputStream getAttachmentContent(String attachmentId);
&List&Attachment& getTaskAttachments(String taskId);
&List&Attachment& getProcessInstanceAttachments(String processInstanceId);
&void deleteAttachment(String attachmentId);
& & &上面的方法中,基本上就是围绕附件的一些添加删除和查询的方法,都老一套了,没什么新鲜的了,按照老规矩,给个例子锻炼一下吧
&span style=&font-family:Comic Sans MS;font-size:18&&public class CreateAttachment {
public static void main(String[] args) throws Exception {
// 获取流程引擎实例
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 获取任务服务组件
TaskService taskService = engine.getTaskService();
// 获取运行服务组件
RuntimeService runtimeService = engine.getRuntimeService();
// 流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource(&bpmn/vacation.bpmn&).deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 查找任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
// 设置任务附件
taskService.createAttachment(&web url&, task.getId(), pi.getId(), &&,
&163 web page&, &&);
// 创建图片输入流
InputStream is = new FileInputStream(new File(&resource/artifact/result.png&));
// 设置输入流为任务附件
taskService.createAttachment(&web url&, task.getId(), pi.getId(), &&,
&163 web page&, is);
& & &任务评论
& & &在日常的工作流程中,有时候随着业务的进行,可能会夹杂着一些个人的流程意见。使用Activiti可以将任务或者流程的评论保存到ACT_HI_COMMENT表中,再来看一下吧!
&Comment addComment(String taskId, String processInstanceId, String message);
&Comment getComment(String commentId);
&void deleteComments(String taskId, String processInstanceId);
&void deleteComment(String commentId);
&List&Comment& getTaskComments(String taskId);
& & &上面就是关于评论的一些操作方法,是不是感觉So easy呢?
&span style=&font-family:Comic Sans MS;font-size:18&&public class AddComment {
public static void main(String[] args) {
// 获取流程引擎实例
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 获取任务服务组件
TaskService taskService = engine.getTaskService();
// 获取运行服务组件
RuntimeService runtimeService = engine.getRuntimeService();
// 流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource(&bpmn/vacation.bpmn&).deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 查找任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
// 添加任务评论
taskService.addComment(task.getId(), pi.getId(), &this is comment message&);
// 查询评论
List&Comment& comments = taskService.getTaskComments(task.getId());
System.out.println(&评论数量:& + comments.size());
版权声明:本文为博主原创文章,未经博主允许不得转载。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有

我要回帖

更多关于 新式传销洗脑太可怕了 的文章

 

随机推荐