映射HttpRequests

时间:2016-06-09 13:29:50

标签: java http servlets java-ee networking

我有一个不受我控制的队列,如果它没有收到先前被解雇的请求的响应,则每1分钟触发一次HTTP请求。我的HTTP请求在内部执行一系列超过一分钟的操作,并在一分钟后给出响应。

编辑:这样做的副作用是,当第一个请求已经执行时第二个请求到达。第二个请求返回失败,因为第一个请求被第一个请求阻止,当原始请求完成时,它返回成功。

不受我控制的队列绑定到显示成功或失败的ui元素。所以现在发生的是,一旦触发,就会首先显示故障状态,这是由于第二个请求的响应,它在早期失败时返回得更快,然后由于原始请求成功完成而成功。 / p>

对此的假设解决方案是将任何新的HTTP请求映射到当前正在执行的HTTP请求。由于它们将共享相同的内存位置,因此请求仅在完成执行时才返回响应。

这可以用Java实现吗?

1 个答案:

答案 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