问题描述
最近碰到一个奇怪的问题,DS 创建工作流成功,但是一旦执行,始终在转,而且没有任何执行的痕迹,后来到数据库一查发现压根没创建任务实例。
我们都知道一个工作流里面可以挂多个任务节点,执行工作流的时候,会创建工作量实例和对应的任务流实例。
但此时只创建了工作流实例,并没有创建任务流实例……继续分析
[ERROR] 2024-03-22 19:09:00.653 +0800 org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteRunnable:[1020] - [WorkflowInstance-39509][TaskInstance-0] - Submit standby task null error, taskCode: 13014149591840
java.lang.NullPointerException: null
[ERROR] 2024-03-22 19:09:00.654 +0800 org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteRunnable:[709] - [WorkflowInstance-0][TaskInstance-0] - Start workflow error
java.lang.NullPointerException: nullat java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)at org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteRunnable.submitStandByTask(WorkflowExecuteRunnable.java:1855)at org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteRunnable.submitPostNode(WorkflowExecuteRunnable.java:1367)at org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteRunnable.call(WorkflowExecuteRunnable.java:703)at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:750)
还有一个特别坑的地方是,发现第一个 null 是没有堆栈信息。这就加大了排查难度,后来发现原来这里已经是失败重试环节,但是最开始是有堆栈信息的。
原因分析
根据前几次的自定义组件开发经验,一开始就怀疑是否参数传落了,特别是一些默认参数。
经过一系列摸索排查,发现在 taskParam 对象里 resourceList 为 null 导致 ds 报错 NPE
{"taskParams": {"localParams": [{"prop": "name","direct": "OUT","type": "VARCHAR","value": "Bob","boolGlobal": false}],"resourceList": null}
}
解决方案
只要在传参到 ds 前给予 resourceList 为空时默认赋值 [] 即可