java - 映射 Http 请求

标签 java http servlets jakarta-ee networking

我有一个不受我控制的队列,如果它没有收到先前触发的请求的响应,则每 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/

相关文章:

java - 服务器启动的监听器和所有 spring bean 完全加载

java - 另一个循环内的迭代循环

java - 检查jsp中的参数是否有效

http - 是否可以在 http 重定向(302 或 307)时设置一些 http header ?

php - 在 HTTP header 中设置到期日期或最长期限

java - 从 servlet 访问 WebContent 文件夹中的文件

java - [HTTP :101401]The url-pattern Coordinator in web application Department. war被映射到多个Servlets?

java - 热衷于将 EntrySet() 方法从 HashMap<Integer,Object> 移植到 trove4j?

java - 如何使 ActionBar 在 "Accessibility Services"处可移动

ruby - 使用 TCPServer 的 Ruby 中的简单 HTTP 服务器