2017-08-08 40 views
1

我使用最新的Acitiviti 5.22.0引擎(更具体地说我使用Alfresco Process Services 1.6.3),并且我实现了一个Spring bean,每10分钟执行一次,以生成JSON表示我的所有流程(流程名称,startDate,endDate,当前任务名称和受理人)将其发送到审计服务器。问题是,我只需要发送自上次运行以来所有已更改的进程。Activiti BPMN引擎:在数据库中存储定制属性

我并不想尽快发送JSON作为一个过程的变化,但做到每10分钟我的审核系统的批量更新。

要做到这一点,我已经尝试过不同的方法。我最近的一个:

  1. 创建一个事件监听器bean侦听所有PROCESS_STARTED,PROCESS_COMPLETED,PROCESS_CANCELLED,TASK_COMPLETED,...
  2. 每次被触发的情况下,存储过程变量“_dirty”,并将其设置为真
  3. 将“_dirty”变量设置为true的所有进程每隔10分钟(执行我的JSON- bean执行)查询
  4. 将JSON发送到审计系统后,将所有“_dirty”进程变量设置为假。

该方法存在的问题:在进程结束后,我无法更新“_dirty”变量。至少我不知道如何。

我的第二种方法是将每个事件的processInstanceId存储到“全局”属性中,但我不知道如何在服务器重新启动时将此“全局”属性存储到数据库中。有没有办法在不创建额外的表,DAO等的情况下将属性或实体持久化到DB中?

就如何解决这一任务的任何想法?所有提示都非常感谢!

回答

0

正如莱纳斯所说:这是不可能的,所以我需要一些完全不同的方法。

我现在建立一个特设的任务,我的属性存储为本地任务变量。 Ad-Hoc任务由系统帐户拥有,并未分配给任何人。通过这种方式,我可以确定,我的真实用户中没有一个试图“完成”任务。此外,如果需要,我还写了一些代码来生成任务,所以如果我想清除它,它会在下一次我想要存储数据时自动创建。

创建即席任务是利用自动装配org.activiti.engine.TaskService到我的类很容易。

Task task = taskService.newTask(); 
task.setDelegationState(DelegationState.PENDING); 
task.setName("Some name goes here"); 
task.setTenantId("your tenant id (if any)"); 
task.setOwner("your system accounts ID"); 
task.setCategory("i use a special category to later query for the task"); 
taskService.saveTask(task); 

任务保存到数据库后,我可以使用taskService存储和检索变量是这样的:

taskService.setVariableLocal(task.getId(), "variableKey", "variableValue"); 

或查询这样的任务:

Task task = taskService.createTaskQuery().taskDelegationState(DelegationState.PENDING).taskCategory("your special category").singleResult(); 

不是一个很好的解决方案(我建议将任务缓存在一个bean或其他东西中,这样你就不需要一直查询它,甚至不需要缓存它的值),但它是有效的。

相关问题