当我尝试在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是最初这样做的最快方式)。
否则这些作业运行正常,并将作业/步骤执行记录到DB。
使用XML时,似乎taskBatchExecutionListener
没有自动添加到作业中,因此任务/批处理关联不会被注册。
这个代码在TaskBatchExecutionListenerBeanPostProcessor
中,可能是因为在使用XML配置时,作业bean的类型为JobParserJobFactoryBean
而不是AbstractJob
。
如果我手动添加监听器,即
<listeners>
<listener ref="taskBatchExecutionListener"/>
</listeners>
在作业xml中,问题得到解决。
我有几个问题:
1)这是Spring Cloud Task中的一个错误 - 即它只是没有正确处理XML配置,如果是这样,我可以为此提出一个问题。
2)Spring Cloud Dataflow应该更好地处理这个吗?看起来表现糟糕的任务可以有效地破坏数据并停止检索包含“好”工作的列表。
我有同样的问题,在我的情况下,通过将@EnableTask添加到作业配置来解决问题
我记得也得到了这个错误,但在我的情况下,我尝试通过spring cloud dataflow服务器API删除任务执行(请参阅https://docs.spring.io/spring-cloud-dataflow/docs/current-SNAPSHOT/reference/htmlsingle/#api-guide-resources-task-executions-delete)。
当我注意到它实际上是一个NO-OP删除(它没有做任何事情并且由开发人员https://github.com/spring-cloud/spring-cloud-dataflow/issues/1844确认)时,我尝试手动删除数据库中的记录,我错过了一些记录。
有一些FK依赖,我的清理不彻底。一旦我重新开始(创建一个新的数据库架构和所有),那么问题就消失了。