首页 > 解决方案 > 当通过邮递员提出停止请求时作业未停止

问题描述

我正在使用 IBM 自由服务器并运行 jsr 352 批处理作业。使用邮递员作为休息电话启动批处理作业。但是当我尝试使用 instanceid 停止作业时,它的状态为“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

标签: batch-processingwebsphere-libertyjsr352

解决方案


“停止”的基础知识,用于 Batchlet 与块步骤

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

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

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

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

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


推荐阅读