如何使用Spring/Servlet支持批量Web api请求处理

Sac*_*ade 18 java spring web-services servlet-filters

我们使用RESTEasy编写了Web API .我们希望为处理Google Batch请求处理工作方式的批处理请求提供支持.

以下是目前使用的方法,

我们有一个过滤器,接受传入的多部分请求.然后,此过滤器创建多个模拟请求和响应对象,然后使用这些模拟请求调用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);
      }

}
Run Code Online (Sandbox Code Playgroud)

MockHttpServletResponseclass返回一个OutputStream包装的虚拟对象ByteArrayOutputStream.

BatchRequestProcessorUtils 解析multipart请求并返回包装实际请求的mock请求,但返回实际请求主体的split body中指定的头.

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

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

Ale*_*kov 3

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

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

我认为应该有两种机制:

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

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

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

希望我的意见对你有帮助。