我正在使用IBM自由服务器并正在运行jsr 352批处理作业。使用邮递员作为休息电话启动批处理作业。但是,当我尝试使用instanceid停止工作时,其状态为“正在停止”,这需要花费自己的时间才能停止。有时它处于“停止”状态几个小时。如何迫使工作停止。
注意:作业具有分区步骤,该步骤从数据库读取并创建输出文件。
使用工作的instanceid,我尝试使用如下所示的postamn put方法停止工作
https:// *****:9443 / ibm / api / batch / jobinstances / 405573?action = stop
//put method from postman
https://*****:9443/ibm/api/batch/jobinstances/405573?action=stop
Response return:
"jobName": "test-job",
"executionId": 405574,
"instanceId": 405573,
"batchStatus": "STOPPING",
"exitStatus": "",
我希望至少在几分钟或一小时后尝试使用以下URL获取批处理状态时,应停止批处理作业。但是在某些情况下需要花费几个小时。
https:// ******:9443 / ibm / api / batch / jobinstances / 405573
答案 0 :(得分:1)
对于块步骤,容器检查以查看在读取和处理每个项目之后是否已发出停止。假设块步骤将读取,处理,写入多个项目的多个块,因此在每个项目之后进行停止检查足以相对较快地停止。另一方面,在批处理步骤中,应用程序处理没有分解成容器已知的任何内容,批处理容器将在单独的线程上调用用户实现的stop()
,应用程序可以用于中断process()
主线程上的处理。
对于花费很长时间来响应stop()
的分块步骤,那么一个解释可能就是该应用程序同样花费很长时间来读取和处理单个项目。
如果它足够重要,则可以通过将项目读取和处理重构为更细粒度的逻辑来解决,因此可以更快地处理每个项目。
如果无法轻松地将逻辑分解成较小的“项目”,则另一种方法是将其重构为一个批处理,您可以在其中实现stop()
方法,并在应用程序内做出适当反应。毕竟,如果您不能将大块分解成较小的项目,那么很有可能就不会从检查点中获得太多价值。