#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";