批量/批量友好操作JAXRS

时间:2015-07-06 11:26:44

标签: jax-rs bulk

我想构建一个JAXRS方法,允许指定要对我的资源执行的操作块。

例如,我有一个资源,Book。在此资源上,我部署了以下方法:创建,删除和更新。如果只是,我在Book资源上设置这些方法,当我的客户端需要对大量书籍资源执行大量更新时,他将不得不为每个Book资源发送大量请求。

我想部署JAXRS操作提供此功能。例如:一个批处理方法,用于接收必须执行的操作。

但是,我不知道该怎么做。 我使用的是JAXRS-2.0。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

这不是一个特定于jaxrs的问题,而是更多的设计问题。 JAXRS的实现相对简单。

根据您的描述,我将创建一个批处理POST端点,该端点具有该作业的特定数据结构。您接受JSON blob(此数据结构的序列化形式),指示端点要执行的操作。一旦端点接收到数据,就会在后台生成一个线程以“执行工作”并返回“作业”的标识符(假设这可能是一个长时间运行的任务)。如果确实返回了“作业ID”,那么您还应该有一个“获取状态”的端点,该端点将返回当前状态,并且可能在作业完成后返回某种输出。

您可能希望接受为JSON的示例数据结构:

{
    job_name: "Some job name",
    requests: [
        {
            tasks: ["UPDATE"],
            book_id: 122,
            data: {
                pages: 155, 
                last_published_date: "2015-09-01"
            }
        },
        {
            tasks: ["DELETE"],
            book_id: 957
        }
    ]
}

您在JAXRS中的实际端点可能如下所示:

  @POST
  @Path(value = "batch")
  @Produces(MediaType.APPLICATION_JSON)
  public String batchRequest(String batchRequest) {
      BatchRequest requestObj = null;

      if (!StringUtils.isBlank(batchRequest))
      {
          Gson gson = new Gson();
          requestObj = gson.fromJson(batchRequest, BatchRequest.class);

          // This is the class that would possibly spawn off a thread
          // and return some sort of details about the job
          JobDetails jobDetails = JobRunner.run(requestObj);

          return gson.toJson(jobDetails);
      }

      return "error";
}

希望这有意义并有所帮助。请随时回答其他问题,我会尽力帮助!