【发布时间】:2016-06-11 19:26:03
【问题描述】:
我有这样的代码。每个方法都是一个独立暴露于 rest 调用的阶段:
void methodA(@FormDataParam ("fd") fd){
//Executor spawns thread - takes around 15-30 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}
void methodB(){
//Executor spawns thread - takes around 60-600 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}
void methodC(){
//Executor spawns thread - takes around 10-60 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}
这些阶段之前是按顺序执行的。现在,如果需要,额外的要求是一次性执行它们。为此,必须将单个 api 公开为 rest api,例如:
void methodAll(@FormDataParam ("fd") fd){
methodA(fd);
methodB();
methodC();
}
问题是 methodA()、methodB()、methodC() 主线程立即返回,而它们产生的线程仍在运行,因此导致其他后续方法在前一个方法完成之前开始执行。
我正在修复中,如何在不对现有三个 api 进行实质性更改的情况下解决此问题?
【问题讨论】:
-
一种方式——使用并传入回调
-
MetgodB 需要方法 A 的结果才能完成工作?
-
最好的方法是重构代码,使这三个方法不返回 void 并且不执行线程。相反,它们只是执行它们的操作并返回它们的结果,然后在单个后台线程中连续调用这三个。
-
@HovercraftFullOfEels 感谢您的调查。是的,重构是您建议的一种方式,但我将其保留为最后一个选项,因为它阻碍了当前独立运行的执行模式。如果我没有得到更好的解决方案,我会继续。
-
@djxak - 没有朋友。 MethodB 不需要来自 MethodA 的输入,但由于这些是生命周期阶段,methodA 必须在 methodB 之前完成。实际上,当前 methodA 将其状态写入 DB 表中。如果没有对应于 methodA 的状态完成,则 methodB 永远不会启动。因此,一种方法是在特定时间的睡眠状态下循环,但我对其他更好的解决方案持开放态度。
标签: java multithreading rest