如何从Java的后台服务发送POST请求?

时间:2018-07-04 07:01:59

标签: java http post

我目前正在研究一个Java应用程序,该应用程序从表A读取(存储了BLOB),将一些数据从表A写入表B,同时将BLOB数据上传到文件服务器。我在一个测试数据库(大约400行)上测试了该应用程序,并且运行良好。我需要将应用程序实现为后台服务,该服务读取表A并将HTTP POST请求发送到REST服务器,然后插入到表B并上传到文件服务器。 POST请求后,服务器需要返回创建的HTTP 202。我尝试过这样的事情:

@POST
@Path("attachments")
public void moveToMinio() throws Exception {
    TiedostoDaoImpl tiedostoDao = new TiedostoDaoImpl();
    List<Integer> id = tiedostoDao.getDistinctCustomerId();
    for (Integer userId : id){
    AttachmentService.insertAndUploadService(userId);
    }
}

tiedostoDao.getDistinctCustomerId()返回表A中不同的客户ID的列表,并将该ID传递给for循环内的AttachmentService.insertAndUploadService()。这样就可以完成工作,但是我怀疑这不是正确的方法,因为它返回HTTP 200而不是202。这是发送POST请求的正确方法吗?生产数据库可能有数百万行,在不影响服务器效率的情况下处理所有这些行的正确方法是什么?因为我是Java新手,所以我对此一直停留了一段时间,非常感谢您的帮助/建议。

2 个答案:

答案 0 :(得分:0)

如果您希望在处理完每一行后都发出http响应,则首先需要将您的方法划分为一次处理一行,然后可以使用Response来包含您的http代码和实体,如下所示:

@POST
@Path("attachments")
public Response moveToMinio() throws Exception {
    TiedostoDaoImpl tiedostoDao = new TiedostoDaoImpl();
    Integer userId = tiedostoDao.getOneCustomerId();
    String uploadLink = AttachmentService.insertAndUploadService(userId);

    return Response.status(Response.Status.ACCEPTED).entity(uploadLink).build();
}

答案 1 :(得分:0)

请参阅此How to run a background task in a servlet based web application?

在返回响应之前,请将作业放入全局队列中,并让后台进程执行该作业。