考虑一个当前具有某些价值的流程实例变量。我想使用Activiti / Camunda的REST API更新它的值,例如将其增加1。你会怎么做?
问题是REST API具有用于设置变量值并获取它们的服务。但是加入这样的API很容易导致竞争条件。
还要考虑我的示例是关于整数,而变量可能是复杂的JSON对象或数组!
答案 0 :(得分:4)
这个答案适用于Camunda 7.3.0:
没有开箱即用的解决方案。您可以执行以下操作:
在自定义资源端点中,使用自定义命令在一个事务中实现读 - 修改 - 写周期:
protected void readModifyWriteVariable(CommandExecutor commandExecutor, final String processInstanceId,
final String variableName, final int valueToAdd) {
try {
commandExecutor.execute(new Command<Void>() {
public Void execute(CommandContext commandContext) {
Integer myCounter = (Integer) runtimeService().getVariable(processInstanceId, variableName);
// do something with variable
myCounter += valueToAdd;
// the update provokes an OptimisticLockingException when the command ends, if the variable was updated meanwhile
runtimeService().setVariable(processInstanceId, variableName, myCounter);
return null;
}
});
} catch (OptimisticLockingException e) {
// try again
readModifyWriteVariable(commandExecutor, processInstanceId, variableName, valueToAdd);
}
}
参见[2]进行详细讨论。
[1] http://docs.camunda.org/manual/7.3/api-references/rest/#overview-embedding-the-api
[2] https://groups.google.com/d/msg/camunda-bpm-users/3STL8s9O2aI/Dcx6KtKNBgAJ