Java后台服务可自动执行POST请求

时间:2018-08-25 18:34:16

标签: java jax-rs

我有一个Java服务,该服务从表'A'读取数据(包括BLOB),将这些数据写入表'B',并将BLOB作为ByteArrayInputStream上载到存储服务器(基本上是一个小型迁移服务)。成功完成上传过程后,两个表上的布尔列均设置为1。该服务以以下方式工作:将POST请求发送到REST服务器,并为复制的每一行返回一个位置标头作为响应。处理POST请求的资源方法如下所示。

@POST
@Produces({MediaType.APPLICATION_JSON})
public Response migrateToMinio(@Context UriInfo uriInfo) throws Exception {
    tiedostoService = new TiedostoService();
    attachmentService = new AttachmentService();
    List<Tiedosto> tiedostoList = tiedostoService.getAllFiles();
    List<String> responseList = new ArrayList<>();
    Response r;
    Integer newRow;
    String responseData = null;
    int i=1;
    for (Tiedosto tiedosto : tiedostoList) {
        Attachment attachment = new Attachment();
        attachment.setCustomerId(tiedosto.getCustomerId());
        attachment.setSize(tiedosto.getFileSize());
        newRow = attachmentService.createNew(attachment);
        UriBuilder builder = uriInfo.getAbsolutePathBuilder();
        if (newRow == 1) {
            builder.path(Integer.toString(i));
            r = Response.created(builder.build()).build();
            responseData = r.getLocation().toString();
            i++;
        }
        responseList.add(responseData);
    }
    String jsonString = new Gson().toJson(responseList);
    return Response.status(Response.Status.OK).entity(jsonString).build();
}

首先,通过POST向api生成一个JWT,并将其用作承载令牌,将另一个POST发送至“ / rest / attachments”,经过一段时间的处理后,它将返回状态200,像这样。

enter image description here

我的问题是,我如何实现Java后台服务(例如与服务器在同一台物理计算机上运行的客户端),该服务将自动向REST服务器发送POST请求以进行迁移过程?第一次运行时,后台服务应处理整个表,然后,后台服务需要定期运行以检查是否已向表中添加了新行并进行相应处理。我是Java新手,非常感谢任何帮助/建议。

1 个答案:

答案 0 :(得分:0)

  

我的问题是,如何实现Java后台服务(例如   与服务器在同一台物理计算机上运行的客户端)   会自动将POST请求发送到REST服务器   迁移过程?

您可以使用JAX-RS client API将HTTP POST请求发送到localhost

Client client = ClientBuilder.newClient();
Response res = client.target("http://localhost/your/path/here").request("application/json").post(/* ... Entity that goes in the message body ... */);
  

在第一次运行时,后台服务应处理整个   表,然后后台服务需要定期运行   检查新行是否已添加到表和进程中   相应地。

立即触发第一个(一组)HTTP请求,然后使用ExecutorService以固定速率(或固定时间间隔,具体取决于您的特定需求)触发HTTP POST

public class ClientService {

    private static final ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(1);

    private static final long INITIAL_DELAY = 10_000;
    private static final long UPDATE_RATE = 10_000;

    public static void main(String[] args) {
        // Fire first (full?) update trigger here
        fireInitialMigration();
        // For subsequent (incremental?) updates, schedule an HTTP POST to occur at a fixed rate:
        EXECUTOR.scheduleAtFixedRate(() -> fireSubsequentUpdate(), INITIAL_DELAY, UPDATE_RATE, TimeUnit.MILLISECONDS);
        // Keep main thread alive
        while (true);
    }

    private static void fireInitialMigration() {
        Client client = ClientBuilder.newClient();
        Response res = client.target("http://localhost/your/path/here").request("application/json").post(/* ... Entity that goes in the message body ... */);
    }

    private static void fireSubsequentUpdate() {
        // Similar to initialMigration(), but change Entity/set of HTTP POSTs according to your needs.
    }
}