我有一个不受我控制的队列,如果它没有收到先前触发的请求的响应,则每 1 分钟触发一次 HTTP 请求。我的 HTTP 请求在内部执行一系列超过一分钟的操作,并在一分钟后给出响应。
编辑:这样做的副作用是,当第一个请求已经执行时第二个请求到达。第二个请求返回失败,因为它被第一个请求阻止,而当原始请求完成时,它返回成功。
不受我控制的队列与显示成功或失败的 ui 元素相关联。所以现在发生的情况是,一旦触发,首先会显示失败状态,因为第二个请求的响应返回得更快,因为它提前失败,然后由于原始请求成功完成而显示成功。
对此的假设解决方案是将任何新的 HTTP 请求映射到当前正在执行的 HTTP 请求。由于它们共享相同的内存位置,因此请求仅在执行完毕后才会返回响应。
这可以用Java实现吗?
最佳答案
您需要异步工作并将中间数据保存到数据库。
这是一个可能的伪代码:
// Servlet code
receive requestX
requestOnDatabase = loadFromDatabase(requestX);
if (requestOnDatabase) {
if (requestOnDatabase.state == FINISHED) {
return requestOnDatabase.result;
} else {
return NOT_YET_FINISHED;
}
} else {
requestX.state = NEW_REQUEST;
addToDatabase(requestX);
startThread(requestX);
}
return NOT_YET_FINISHED;
// Asynchronous thread
...
requestX.result = ...
requestX.state = FINISHED;
saveOnDatabase(requestX);
这种代码将启动异步线程并返回一个代码,该代码仅表示请求已被接受并且进程已启动但尚未完成。
任何连续的请求都将检查数据库的状态,如果尚未完成,则返回当前状态。
最后,异步线程结束后,任何后续请求都将返回保存在数据库中的结果。
这可以用以下模式来解释
Servlet Asynchronous thread Database
----------------------------------------------------------------
First Request received
Request not present on db
Create new record on db
request.state = NEW_REQUEST
Starts new thread
xxxxxxxxxxxxxxxxxxxx
Thread started
returns NEW_REQUEST
....
Second Request received
Request present on db
returns NEW_REQUEST
...
Request received
Request present on db
returns NEW_REQUEST
request.state = FINISHED
request.result = XXX
saveToDb(request)
end of asynchronous thread
xxxxxxxxxxxxxxxxxxxxxxxxxx
request.state = FINISHED
request.result = XXX
...
Third Request received
Request present on db
returns request.result
...
Fourth Request received
Request present on db
returns request.result
关于java - 映射 Http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727421/