我有一个不受我控制的队列,如果它没有收到先前被解雇的请求的响应,则每1分钟触发一次HTTP请求。我的HTTP请求在内部执行一系列超过一分钟的操作,并在一分钟后给出响应。
编辑:这样做的副作用是,当第一个请求已经执行时第二个请求到达。第二个请求返回失败,因为第一个请求被第一个请求阻止,当原始请求完成时,它返回成功。
不受我控制的队列绑定到显示成功或失败的ui元素。所以现在发生的是,一旦触发,就会首先显示故障状态,这是由于第二个请求的响应,它在早期失败时返回得更快,然后由于原始请求成功完成而成功。 / p>
对此的假设解决方案是将任何新的HTTP请求映射到当前正在执行的HTTP请求。由于它们将共享相同的内存位置,因此请求仅在完成执行时才返回响应。
这可以用Java实现吗?
答案 0 :(得分:1)
您需要异步工作并将中间数据保存到数据库中。
这是一个可能的伪代码:
// 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