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个解析器中间可以解析的变量