Activiti设置流程发起用户信息

先来看一段API调用:

?
1
2
List hpis = historyService.createHistoricProcessInstanceQuery()
            .startedBy(userCode).list();

查询结果为空,这是为什么?

1.原因说明

当通过runtimeService接口启动(startProcessInstance[Byxxx])流程的时候会设置一个变量,代码片段(ProcessDefinitionEntity.java#createProcessInstance):

?
85
86
87
88
89
String initiatorVariableName = (String) getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME);
if (initiatorVariableName!=null) {
    String authenticatedUserId = Authentication.getAuthenticatedUserId();
    processInstance.setVariable(initiatorVariableName, authenticatedUserId);
}

从上面的代码片段中可以看出在启动流程的时候引擎会先从Authentication读取已认证用户信息;现在我们只要能设置认证用户的ID就可以了。

2.解决问题

查看API发现接口IdentityService有一个方法:setAuthenticatedUserId(String authenticatedUserId),正是这个方法在其接口实现类:org.activiti.engine.impl.IdentityServiceImpl#setAuthenticatedUserId中调用了Authentication.setAuthenticatedUserId()

解决办法很简单只要在启动流程之前调用API即可:identityService.setAuthenticatedUserId(userId);

?
1
2
identityService.setAuthenticatedUserId(userId);
processInstance = runtimeService.startProcessInstanceByKey("leave", entityId, variables);

当流程启动之后可以到表ACT_HI_PROCINST中查看字段START_USER_ID_的值来验证是否生效。

3.结束

问题很简单,但是官网的手册没有提到,希望让遇到问题的人少走弯路。

上一篇:三大模块构建智慧养鹿综合解决方案,阿里云AIoT推动畜牧业绿色发展


下一篇:信息安全不能做减法