如何支持使用 Spring/Servlets 进行批处理 Web API 请求处理

2022-09-02 22:39:27

我们使用 RESTEasy 编写了 Web API。我们希望为批处理请求提供支持,就像 Google 批处理请求处理的工作方式一样。

以下是目前使用的方法,

我们有一个过滤器,它接受传入的多部分请求。然后,此筛选器创建多个模拟请求和响应对象,然后使用这些模拟请求调用 chain.doFilter。

public class BatchRequestProcessingFilter extends GenericFilterBean {

  @Override
  public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest)req;
            MockHttpServletRequest[] mockRequests = BatchRequestProcessorUtils.parseRequest(request);
            MockHttpServletResponse[] mockResponses = new MockHttpServletResponse[mockRequests.length];
            for(int i=0 ; i <= mockRequests.length ; i++  ) {
                chain.doFilter(mockRequests[i], mockResponses[i], chain);
            }
            BatchRequestProcessingUtils.populateResponseFromMockResponses(res, mockResponses);
      }

}

MockHttpServletResponse类返回一个包裹 的虚拟对象。OutputStreamByteArrayOutputStream

BatchRequestProcessorUtils解析多部分请求并返回模拟请求,该请求包装实际请求,但返回在实际请求正文的拆分正文中指定的标头。

我找不到任何支持批处理请求处理的现有库。所以我的问题是,这是支持批处理请求的正确方法,还是应该使用任何标准方法?

请注意,我们使用的是Tomcat 8。


答案 1

萨钦·戈拉德。我没有听说过这样的库,但我认为你的做法是合理的。如果我必须解决这个问题,我会这样想:

  1. 在我们的HTTP servlet中,我们只能单独处理请求,这就是为什么我们应该将所有要发送的请求包装到客户端的另一个请求中。
  2. 由于在服务器端我们只有一个请求,因此我们应该解开放入其中的所有请求。而且,因为我们不知道如何在批处理机制中处理每个请求 - 我们应该通过所有过滤器/servlet发送它。这也是将我们的批处理过滤器放在订单中的第一个位置的原因。
  3. 最终,当所有请求都已处理完毕后,我们应该将响应发送回客户端。同样,要做到这一点,我们应该将所有响应包装成一个响应。
  4. 在客户端,我们应该解开响应的包装,并将每个响应发送到一些可以处理它的对象。

在我看来,应该有两种机制:

  1. 客户端的批处理发送方,负责收集和包装请求,打开响应并将其发送到其处理器(处理常规响应的方法)。
  2. 服务器端的批处理处理器,负责打开请求,收集和包装响应。

当然,这两个部分可以耦合(即具有共享的“包装器”模块),因为我们必须以相同的方式包装和展开对象。

此外,如果我在它上面工作,我会尝试开发客户端机制,就像我用来发送常规请求的类上的装饰器一样。在这种情况下,我可以随时替换常规/批处理模式。

希望我的意见对您有所帮助。


答案 2

推荐