当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring/Servlets支持批处理web api请求

袁秦迟
2023-03-14

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

以下是目前使用的方法,

我们有一个过滤器,它接受传入的多部分请求。然后,此过滤器创建多个模拟请求和响应对象,然后调用链。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类返回一个虚拟的OutputStream,它将通过TearayoutPutStream封装。

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

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

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

共有1个答案

司徒英卓
2023-03-14

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

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

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

  1. 客户端的批处理发送器,负责收集和包装请求、展开响应并将其发送给其处理器(处理常规响应的方法)

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

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

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

 类似资料:
  • 我需要用Storm处理成批的元组。我的最后一个bolt必须等到拓扑接收到整个批处理之后才能进行一些处理。为了避免混淆--对我来说,批处理是一组N条消息,它们是实时的,这个术语不需要与批处理(Hadoop)联系在一起。即使2条消息也可以是一批。 阅读Storm的文档是否可以说Storm不支持这种批处理(实时的批处理=N条消息)? 所以我的问题是给你们,我亲爱的Storm大师们,这个拓扑是不是设计得很

  • 我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的超文本传输协议请求。javascript向服务器发送一个HTTP DELETE请求,其中包括路径中对象的id,并在JSON对象中发送请求正文中的注释。 我已经尝试用一个JavaWeb服务对象和一个普通的servlet来实现删除请求。在这两种情况下,当我在没有正文的情况下提出请求时,它都是有效的,但当我添

  • Cassaforte具有插入批处理功能,可一次性将多行插入到cassandra CQL表中。 我最近切换到Alia,我想知道它是否提供相同的功能?我不能立即在留档中看到任何内容,并且(hayt/value…)似乎一次只支持单行插入。

  • 我想从mysql读取数据,然后写入sftp。现在我将文件写入本地,从本地写入sftp,最好的方法是什么?

  • 我正在为Grails使用Spring批处理插件(Spring-batch-1.0.RC2)。到目前为止工作正常,但我想分割流来执行。。。支持吗?这是我试图执行的代码。。。但结果是第一步,第二步,第三步,第四步。 谢啦!

  • 我正在使用Spring 5 WebClient。我想知道是否可以将其配置为使用HTTP代理,或者是否有方法更改其默认配置以使用HTTP代理。