问题描述
查询用户参与的流程时(query.involvedUser(uid)😉,返回了完全不相关的流程信息,发现ACT_RU_IDENTITYLINK和ACT_HI_IDENTITYLINK都存储了和流程无关的用户ID,角色类型都是参与者participant,于是一步步梳理。
源码追踪
首先由任务完成的complete方法定位到
TaskEntity类的complete方法
if (Authentication.getAuthenticatedUserId() != null && processInstanceId != null) {
getProcessInstance().involveUser(Authentication.getAuthenticatedUserId(), IdentityLinkType.PARTICIPANT);
}
原来在这里进行了participant的插入
public IdentityLinkEntity involveUser(String userId, String type) {
for (IdentityLinkEntity identityLink : getIdentityLinks()) {
if (identityLink.isUser() && identityLink.getUserId().equals(userId)) {
return identityLink;
}
}
return addIdentityLink(userId, null, type);
}
再跟踪Authentication.getAuthenticatedUserId()方法,定位到
public abstract class Authentication {
static ThreadLocal<String> authenticatedUserIdThreadLocal = new ThreadLocal<String>();
public static void setAuthenticatedUserId(String authenticatedUserId) {
authenticatedUserIdThreadLocal.set(authenticatedUserId);
}
public static String getAuthenticatedUserId() {
return authenticatedUserIdThreadLocal.get();
}
}
于是真相大白,虽然说ThreadLocal会为不同线程保存变量,然而毕竟索引的key是线程ID,而工程里使用了线程池,于是导致ThreadLocal中的值互串~~~
解决方法
1、改写源码,在使用后调用ThreadLocal的remove方法,成本比较高
2、在流程启动后,调用setAuthenticatedUserId(null)