当我尝试在 UI 的“作业”选项卡(“获取数据时出错。数据流服务器是否正在运行?”)或通过 REST API(500 NullPointerException)获取作业执行列表时,我发现了一个问题。
日志中的错误是
java.lang.NullPointerException: null
at org.springframework.cloud.dataflow.server.service.impl.DefaultTaskJobService.getTaskJobExecution(DefaultTaskJobService.java:231) ~[spring-cloud-dataflow-server-core-1.1.2.RELEASE.jar!/:1.1.2.RELEASE]
这似乎是由代码引起的:
taskExplorer.getTaskExecutionIdByJobExecutionId(jobExecution.getId())
对此进行调查,似乎我的一些工作没有与任务 ID 相关联 - 即 task_task_batch 表中没有条目,如果我尝试检索其中一个工作或所有工作的列表,我会得到 NullPointerException。
直接通过在 task_task_batch 表中有关联的 id 检索作业是可以的。
调查为什么我的一些工作任务会发生这种情况,这似乎是因为其中一些使用 XML 而不是 Java Config 来配置工作(我们有一些预先存在的复杂工作,我们正在从 XD 转移到 Spring Cloud Data Flow 和保留 XML 是最初执行此操作的最快方法)。
否则,这些作业运行良好,并将作业/步骤执行记录到数据库。
使用 XML 时,似乎taskBatchExecutionListener
没有自动添加到作业中,因此任务/批处理关联没有被注册。
代码在TaskBatchExecutionListenerBeanPostProcessor
其中,这可能是因为在使用 XML 配置时,作业 bean 是 typeJobParserJobFactoryBean
而不是AbstractJob
.
如果我手动添加监听器,即
<listeners>
<listener ref="taskBatchExecutionListener"/>
</listeners>
在工作 xml 中,问题已解决。
我有几个问题:
1) 这是 Spring Cloud Task 中的一个错误 - 即它只是没有正确处理 XML 配置,如果是这样,我可以为此提出一个问题。
2) Spring Cloud Dataflow 是否应该更好地处理这个问题?一个表现不佳的任务似乎可以有效地破坏数据并停止检索包含“好”工作的列表。