这可能是一个简单的问题,但是我现在似乎找不到一个好的解决方案。

我有:


OldApp-从命令行启动的Java应用程序(此处无Web界面)
NewApp-在Apache之后具有REST API的Java应用程序


我希望OldApp通过其REST API调用NewApp,当NewApp完成后,OldApp应该继续。

我的问题是NewApp做很多事情,可能要花很多时间,在某些情况下会导致Apache超时,然后向OldApp发送502错误。计算在NewApp中继续,但是OldApp不知道何时完成NewApp。

我想到的一种解决方案是在NewApp中派生一个线程,并为API请求存储某种ID,然后将其返回给OldApp。然后,OldApp可以轮询NewApp以查看线程是否已完成,如果已完成,请继续。否则-继续轮询。

这样的设计是否有好的设计模式?我在使事情复杂化吗?关于如何思考的任何提示?

最佳答案

如果NewApp需要很长时间,则应立即返回202 Accepted。响应中应包含一个Location标头,该标头指示用户可以在完成后查找结果的位置以及对请求完成时间的估计。

OldApp应该等到估计时间到达后,再向该位置提交新的GET调用。来自该GET的响应将是预期数据,或者是具有新的估计时间的实体。然后,OldApp可以在稍后的时间再试一次,重复直到获得预期的数据为止。

因此,对话可能看起来像:

POST /widgets
response:
202 Accepted
Location: "http://server/v1/widgets/12345"
{
    "estimatedAvailableAt": "<whenever>"
}




GET /widgets/12345
response:
200 OK
Location: "http://server/v1/widgets/12345"
{
    "estimatedAvailableAt": "<wheneverElse>"
}




GET /widgets/12345
response:
200 OK
Location: "http://server/v1/widgets/12345"
{
    "myProperty": "myValue",
    ...
}

07-27 22:09