Как ждать 30 секунд или закончить, если я получил ответ? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть метод ниже, который отправляет уведомление, а затем ждет 30 секунд.Но я пытаюсь добиться того, чтобы отправлять уведомления, а затем каждую секунду проверять базу данных (слишком много?), Чтобы узнать, получил ли я ответ от уведомления.Если я получил ответ из уведомления, мне больше не нужно ждать, и мне нужно продолжить.В противном случае мне нужно подождать до 30 секунд.

@RequestMapping("/sendNotification")
public HashMap<String, Object> sendNotification(@RequestBody SingleFieldPojo singleFieldPojo) {
    MessagingFCM.sendMessageToDevice("Title", singleFieldPojo.getToken());
    final CountDownLatch latch = new CountDownLatch(1);        
    try {
        latch.await(30, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
        latch.countDown();
    }
    latch.countDown();
    HashMap<String, Object> output = new HashMap<>();
    output.put("success", jobStatusRepo.findById(singleFieldPojo.getJobBoardId()));
    return output;
}

Ответы [ 2 ]

0 голосов
/ 02 июня 2018
@RequestMapping("/sendNotification")
    public HashMap<String, Object> sendNotification(@RequestBody SingleFieldPojo singleFieldPojo) {
        System.out.println("category: " + singleFieldPojo);

        if (!StringUtils.isEmpty(singleFieldPojo.getBrowserIdToken())) {
            MessagingFCM.sendMessageToDevice("Title", singleFieldPojo.getJobBoardId(), singleFieldPojo.getBrowserIdToken());
        }
        if (!StringUtils.isEmpty(singleFieldPojo.getPhoneIdToken())) {
            MessagingFCM.sendMessageToDevice("Title", singleFieldPojo.getJobBoardId(), singleFieldPojo.getPhoneIdToken());
        }

        // Run a task specified by a Supplier object asynchronously
        CompletableFuture<HashMap<String, Object>> future = CompletableFuture.supplyAsync(() -> {
            Optional<JobStatus> jobStatus = jobStatusRepo.findById(singleFieldPojo.getJobBoardId());
            HashMap<String, Object> output = new HashMap<>();
            if (jobStatus.isPresent()) {
                String status = jobStatus.get().getJobStatus();
                final CountDownLatch latch = new CountDownLatch(1);
                try {
                    do {
                        Optional<JobStatus> jobStatusNew = jobStatusRepo.findById(singleFieldPojo.getJobBoardId());
                        if(jobStatusNew.isPresent()) {
                            if(StringUtils.equals(status, "accept")) {
                                latch.countDown();
                            }
                        }
                        status = jobStatusNew.get().getJobStatus();
                        latch.await(2, TimeUnit.SECONDS);
                    } while (status.equals("accepted"));

                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
            }
            return output;
        });

        // Block and get the result of the Future
        HashMap<String, Object> result = null;
        try {
            result = future.get(30, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        HashMap<String, Object> output = new HashMap<>();
        output.put("success", jobStatusRepo.findById(singleFieldPojo.getJobBoardId()));
        return output;
    }
0 голосов
/ 02 июня 2018

Вы можете сделать это, используя CompletableFuture.

try {
    thing = CompletableFuture.runAsync(myTask).get(10, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
    throw new RuntimeException(e); 
} catch (TimeoutException | CancellationException e) {
    // it timed out or was cancelled
}

Однако этот способ остановит задачу, если истечет время ожидания.Я не уверен, что ты этого хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...