先来看一段API调用:
List hpis = historyService.createHistoricProcessInstanceQuery()
.startedBy(userCode).list();
查询结果为空,这是为什么?
1.原因说明
当通过runtimeService接口启动(startProcessInstance[Byxxx])流程的时候会设置一个变量,代码片段(ExecutionEntityManagerImpl.java#createProcessInstanceExecution):
String authenticatedUserId = Authentication.getAuthenticatedUserId();
processInstanceExecution.setStartActivityId(startActivityId);
processInstanceExecution.setStartTime(CommandContextUtil.getProcessEngineConfiguration().getClock().getCurrentTime());
processInstanceExecution.setStartUserId(authenticatedUserId);
// Store in database
insert(processInstanceExecution, false);
if (initiatorVariableName != null) {
processInstanceExecution.setVariable(initiatorVariableName, authenticatedUserId);
}
从上面的代码片段中可以看出在启动流程的时候引擎会先从Authentication读取已认证用户信息authenticatedUserId ,并将此id
设为当前流程实例的startUserId,并作为流程变量和initiatorVariableName(在流程图里自定义)绑定;现在我们只要能设置认证
用户的ID就可以了。
2.解决问题
查看API发现Authentication有一个方法:setAuthenticatedUserId()。
解决办法很简单只要在启动流程之前调用API即可:Authentication.setAuthenticatedUserId(userId);
当流程启动之后可以到表ACT_HI_PROCINST中查看字段START_USER_ID_的值来验证是否生效。
3.结束
问题很简单,但是官网的手册没有提到,希望让遇到问题的人少走弯路。