Фоновый сервис Java для автоматизации запросов POST - PullRequest
0 голосов
/ 25 августа 2018

У меня есть служба Java, которая считывает данные (включая BLOB) из таблицы «A», записывает эти данные в таблицу «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();
}

Сначала JWT генерируется через POST для API и, используя его в качестве токена-носителя, другой POST отправляется в "/ rest / attachments", этовозвращает статус 200 после некоторого времени обработки, например:

enter image description here

У меня вопрос, как я могу реализовать фоновую службу Java (как клиенткоторый будет работать на том же физическом компьютере, что и сервер), который будет автоматически отправлять запросы POST серверу REST для процесса миграции?При первом запуске фоновая служба должна обрабатывать всю таблицу, а после этого фоновая служба должна периодически запускаться, чтобы проверить, были ли добавлены новые строки в таблицу, и обработать их соответствующим образом.Я нуб из Java и буду очень признателен за любую помощь / предложения.

1 Ответ

0 голосов
/ 25 августа 2018

Мой вопрос заключается в том, как я могу реализовать фоновую службу Java (например, клиент, который будет работать на той же физической машине, что и сервер), которая будет автоматически отправлять запросы POST на сервер REST для процесса миграции?

Вы можете использовать клиентский API JAX-RS для отправки 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.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...