ServiceTask的运行:流程引擎中表达式的写法 - AndiHappy/customcamunda GitHub Wiki

ServiceTask的一个配置如下:

<serviceTask id="Call_WS" name="Call WS" activiti:class="com.camunda.training.delegate.WsDelegate" >
      <extensionElements>
        <activiti:field name="wsdl" expression="http://localhost:18080/VacationService?wsdl" />
        <activiti:field name="operation" expression="saveVacationApproval" />
        <activiti:field name="parameters" expression="${user}, ${days}" />
        <activiti:field name="returnValue" expression="myReturn" />
      </extensionElements>
</serviceTask>

其中的表达式的解析和得到,比较的有意思,使用的是 JuelExpression 解决表达式的

  public Object getValue(VariableScope variableScope, BaseDelegateExecution contextExecution) {
    ELContext elContext = expressionManager.getElContext(variableScope);
    try {
      ExpressionGetInvocation invocation = new ExpressionGetInvocation(valueExpression, elContext, contextExecution);
      Context.getProcessEngineConfiguration()
        .getDelegateInterceptor()
        .handleInvocation(invocation);
      return invocation.getInvocationResult();
    } catch (PropertyNotFoundException pnfe) {
      throw new ProcessEngineException("Unknown property used in expression: " + expressionText+". Cause: "+pnfe.getMessage(), pnfe);
    } catch (MethodNotFoundException mnfe) {
      throw new ProcessEngineException("Unknown method used in expression: " + expressionText+". Cause: "+mnfe.getMessage(), mnfe);
    } catch(ELException ele) {
      throw new ProcessEngineException("Error while evaluating expression: " + expressionText+". Cause: "+ele.getMessage(), ele);
    } catch (Exception e) {
      throw new ProcessEngineException("Error while evaluating expression: " + expressionText+". Cause: "+e.getMessage(), e);
    }
  }
expressionManage:org.camunda.bpm.engine.impl.el.ExpressionManager@68ef01a5

表达式的解析:

protected ELResolver createElResolver() {
    CompositeELResolver elResolver = new CompositeELResolver();
    elResolver.add(new VariableScopeElResolver());
    elResolver.add(new VariableContextElResolver());
    elResolver.add(new MockElResolver());
    if(beans != null) {
      // ACT-1102: Also expose all beans in configuration when using standalone engine, not
      // in spring-context
      elResolver.add(new ReadOnlyMapELResolver(beans));
    }

    elResolver.add(new ProcessApplicationElResolverDelegate());

    elResolver.add(new ArrayELResolver());
    elResolver.add(new ListELResolver());
    elResolver.add(new MapELResolver());
    elResolver.add(new ProcessApplicationBeanElResolverDelegate());

    return elResolver;
  }

@Override
	public Object getValue(ELContext context, Object base, Object property) {
		context.setPropertyResolved(false);
		for (ELResolver resolver : resolvers) {
			Object value = resolver.getValue(context, base, property);
			if (context.isPropertyResolved()) {
				return value;
			}
		}
		return null;
	}

需要详细的理解解析,需要针对这个的解析器,看到这8个解析器中间可以解析的变量