blog

파워잡의 평가자에 대해 이야기하기

이 문서에서는 PowerJob의 평가자 평가자에 중점을 둡니다....

Oct 3, 2025 · 3 min. read
シェア

시퀀스

이 문서에서는 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)를 통해 노드 결과를 계산합니다.

Read next

안드로이드 기반 휴대폰 주문 시스템 설계 및 구현

요약 : 통신 기술의 발전으로 무선 데이터의 전송 속도와 대역폭이 크게 증가했으며 오늘날 지능형 단말기 플랫폼이 등장했습니다.

Oct 3, 2025 · 1 min read