lemon
lemon copied to clipboard
流程跟踪图生成TODO问题解决。
com.mossle.bpm.graph.ActivitiHistoryGraphBuilder.fetchHistoricActivityInstances()
原代码
// TODO: 如果用了uuid会造成这样排序出问题 // 但是如果用startTime,可能出现因为处理速度太快,时间一样,导致次序颠倒的问题 historicActivityInstanceQueryImpl.processInstanceId(processInstanceId) .orderByHistoricActivityInstanceId().asc();
替换成
historicActivityInstanceQueryImpl.processInstanceId(processInstanceId) ..orderBy(new HistoricActivityInstanceQueryProperty("to_number(id_)")).asc();
原理 activiti默认使用Long类型作为该字段的数据源(DbIdGenerator), 以字符串形式保存到数据库,未作前补0处理,导致以字符串方式orderby无法达到目标要求, 通过数据库内置函数对该字段做类型转换,以数字型进行排序即可; to_number在oracle和db2上都是支持的,其他数据库不清楚。
Mr jollyja [email protected] 2014.09.12
to_number在mysql上并不支持
在fetchHistoricActivityInstances()中添加
Collections.sort(historicActivityInstances,new Comparator(){
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
HistoricActivityInstance arg1 = (HistoricActivityInstance)o1;
HistoricActivityInstance arg2 = (HistoricActivityInstance)o2;
Integer id1=Integer.parseInt(arg1.getId());
Integer id2=Integer.parseInt(arg2.getId());
return id1.compareTo(id2);
}
});
即可解决
//如果id使用标准uuid(8-4-4-4-12)的解决方法, Collections.sort(historicActivityInstances, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
HistoricActivityInstance arg1 = (HistoricActivityInstance)o1;
HistoricActivityInstance arg2 = (HistoricActivityInstance)o2;
String uuid_id1 = arg1.getId();
String uuid_id2 = arg2.getId();
return UUID.fromString(uuid_id1).compareTo(UUID.fromString(uuid_id2));
}
});