如何使用REST API以原子方式修改变量

时间:2015-09-21 11:07:13

标签: variables activiti camunda

考虑一个当前具有某些价值的流程实例变量。我想使用Activiti / Camunda的REST API更新它的值,例如将其增加1。你会怎么做?

问题是REST API具有用于设置变量值并获取它们的服务。但是加入这样的API很容易导致竞争条件。

还要考虑我的示例是关于整数,而变量可能是复杂的JSON对象或数组!

1 个答案:

答案 0 :(得分:4)

这个答案适用于Camunda 7.3.0:

没有开箱即用的解决方案。您可以执行以下操作:

  1. 使用实现变量修改端点的自定义资源扩展REST API。由于Camunda REST API使用JAX-RS,因此可以将Camunda REST资源添加到自定义JAX-RS应用程序中。有关详细信息,请参见[1]。
  2. 在自定义资源端点中,使用自定义命令在一个事务中实现读 - 修改 - 写周期:

    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);
      }
    }
    
  3. 参见[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