асинхронный метод java на уровне службы

#java #spring-boot #spring-mvc #thymeleaf #pubnub

Вопрос:

Я использую библиотеку под названием PubNub для публикации сообщений. Метод PubNub публикует сообщения асинхронно, и у него есть способ узнать, было ли сообщение отправлено или нет.

Я использую Spring MVC и ThymeLeaf, поэтому я хотел бы отправить ответ обратно на свой интерфейс после получения статуса сообщения (ошибка или успех), однако я не знаю, как дождаться завершения моего метода PubNub, а затем отправить результат. Вот код:

     @Controller
    public class HomeController {
    
        @PostMapping("/triggerDevices")
        public String triggerDevices(@ModelAttribute(value = "message") Message message, Model model) {
        //
        //
        // validations and build data
        //
        //
         MyResult result = null;
    
         //Async method
                pubNub.publish()
                .message(message)
                .channel(channel)
                .async((result, status) -> {
                 //This block takes some time
                    if (status == null || status.isError()) {
                       //Error case
                       result = new MyResult (false, status.errorMessage(),message.device);
                    } else {
                       //Success case
                       result = new MyResult (true, null, message.device);
                    }
                });
    
            //Result
            model.addAttribute("result", result);
            return "home :: info-success";
       }  
    
    }
 

Я надеюсь, что кто-нибудь мне поможет, большое спасибо.

Ответ №1:

Публикация PubNub Java SDK sync

Просто используйте этот sync метод вместо async

 PNPublishResult result = pubnub.publish()
                             .channel("coolChannel")
                             .message("test")
                             .shouldStore(true)
                             .ttl(10)
                             .sync();
 

Смотрите полные документы Java SDK PubNub для публикации/синхронизации.

Это должно сделать это за вас. Ваше здоровье!

Комментарии:

1. Я реализовал это таким образом, большое вам спасибо.

2. Дайте моему ответу «проверить» как лучший ответ 🙂

Ответ №2:

Использование синхронизации-это простое решение! но если вам нужно сохранить его асинхронным, я бы вернул результат функции async здесь после того, как вы получите результат:

 //Success case
result = new MyResult (true, null, message.device);
model.addAttribute("result", result);
return "home :: info-success";