시퀀스
이 문서에서는 PowerJob의 평가자에 대해 살펴봅니다.
Evaluator
기술/파워잡/서버/코어/평가자/Evaluator.java
public interface Evaluator {
/**
* 주어진 입력을 사용하여 식을 계산합니다.
*
* @param expression 실행 가능한 표현식
* @param input
* @return 결과 계산하기
*/
Object evaluate(String expression, Object input);
}
평가자 인터페이스는 표현식과 입력이라는 두 개의 매개 변수가 있는 평가 메서드를 정의하고 계산 결과를 반환합니다.
GroovyEvaluator
기술/파워잡/서버/코어/평가자/그루비평가자.java
@Slf4j
@Component
public class GroovyEvaluator implements Evaluator {
private static final ScriptEngine ENGINE = new ScriptEngineManager().getEngineByName("groovy");
@Override
@SneakyThrows
public Object evaluate(String expression, Object input) {
Bindings bindings = ENGINE.createBindings();
bindings.put("context", input);
return ENGINE.eval(expression, bindings);
}
}
DecisionNodeHandler
tech/powerjob/server/core/workflow/hanlder/impl/DecisionNodeHandler.java
@Slf4j
@Component
public class DecisionNodeHandler implements ControlNodeHandler {
private final GroovyEvaluator groovyEvaluator = new GroovyEvaluator();
/**
* 판단 노드 처리하기
* 1. 스크립트 실행
* 2. 반환값에 따라 에지와 노드를 비활성화합니다.
*/
@Override
public void handle(PEWorkflowDAG.Node node, PEWorkflowDAG dag, WorkflowInstanceInfoDO wfInstanceInfo) {
String script = node.getNodeParams();
if (StringUtils.isBlank(script)) {
log.error("[Workflow-{}|{}]decision node's param is blank! nodeId:{}", wfInstanceInfo.getWorkflowId(), wfInstanceInfo.getWfInstanceId(), node.getNodeId());
throw new PowerJobException("decision node's param is blank!");
}
// wfContext must be a map
HashMap<String, String> wfContext = JSON.parseObject(wfInstanceInfo.getWfContext(), new TypeReference<HashMap<String, String>>() {
});
Object result;
try {
result = groovyEvaluator.evaluate(script, wfContext);
} catch (Exception e) {
log.error("[Workflow-{}|{}]failed to evaluate decision node,nodeId:{}", wfInstanceInfo.getWorkflowId(), wfInstanceInfo.getWfInstanceId(), node.getNodeId(), e);
throw new PowerJobException("can't evaluate decision node!");
}
boolean finalRes;
if (result instanceof Boolean) {
finalRes = ((Boolean) result);
} else if (result instanceof Number) {
finalRes = ((Number) result).doubleValue() > 0;
} else {
log.error("[Workflow-{}|{}]decision node's return value is illegal,nodeId:{},result:{}", wfInstanceInfo.getWorkflowId(), wfInstanceInfo.getWfInstanceId(), node.getNodeId(), JsonUtils.toJSONString(result));
throw new PowerJobException("decision node's return value is illegal!");
}
handleDag(finalRes, node, dag);
}
//......
}
결정 노드 핸들러는 groovyEvaluator를 인스턴스화하고 그 핸들 메서드는 groovyEvaluator.evaluate(스크립트, wfContext)를 통해 노드 결과를 계산합니다.





