【问题标题】:Mapping HttpRequests映射 HttpRequest
【发布时间】:2016-10-10 04:37:35
【问题描述】:

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

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

不受我控制的队列与显示成功或失败的 ui 元素相关联。所以现在发生的情况是,一旦触发,首先显示失败状态,这是由于第二个请求的响应更快,因为它提前失败,然后由于原始请求成功完成而成功。

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

这可以用Java实现吗?

【问题讨论】:

    标签: java http servlets jakarta-ee networking


    【解决方案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
    

    【讨论】:

    • 当前请求正在处理时,新请求到达。因此,会发生的情况是新传入的请求将返回失败,然后原始请求完成并返回成功代码。
    • 原始请求和新请求都将失败。异步线程完成后的第三个请求将起作用。一般在异步线程结束前收到的每个请求都会失败,在异步线程结束后的任何请求都正常
    • 不受我控制的队列与显示成功或失败的 ui 元素相关联。所以现在发生的情况是,一旦触发,首先显示失败状态,这是由于第二个请求的响应更快,因为它提前失败,然后由于原始请求成功完成而成功。
    • 我正在寻找一种将传入请求映射到原始请求的方法,这样当我得到原始请求的成功响应时,第二个请求也返回成功。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2019-02-26
    • 2018-06-18
    • 2012-01-04
    • 2021-10-28
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多