通过邮递员发出停止请求时作业不会停止

Job not stopping when the stop request made through postman

我正在使用 IBM 自由服务器和 运行 jsr 352 批处理作业。使用邮递员作为休息电话启动批处理作业。但是当我尝试使用 instanceid 停止作业时,它的状态为 "STOPPING" 并且需要自己的时间来停止。有时它会在几个小时内处于 "STOPPING" 状态。如何强制停止作业。

注意:该作业具有从数据库读取并创建输出文件的分区步骤。

使用作业的 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

关于 "stop" 的 Batchlet 与 Chunk 步骤的基础知识

对于块步骤,容器检查在读取和处理每个项目后是否已发出停止。假设块步骤将读取、处理、写入多个项目的多个块,因此在每个项目之后进行停止检查足以相对较快地停止。另一方面,对于 batchlet 步骤,在应用程序处理未分解为容器已知的任何内容的情况下,批处理容器将在单独的线程上调用用户实现的 stop(),应用程序可以用于中断主 process() 线程上的处理。

关于 Chunk step 的想法需要很长时间才能停止

对于需要很长时间响应 stop() 的块步骤,一种解释可能只是应用程序同样需要很长时间来读取和处理单个项目。

如果它足够重要,也许可以通过将项目读取和处理重构为更细粒度的逻辑来解决这个问题,这样每个项目的处理速度就会更快。

另一种方法,如果逻辑不能轻易分解为更小的 "items",则将其重构为一个 batchlet,您可以在其中自己实现 stop() 方法,然后做出反应在您的应用程序中适当地。毕竟,如果您不能将区块分解成更小的项目,那么您很有可能无法从检查点中获得太多价值。