服务层的异步java方法

问题描述

我正在使用一个名为 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";
       }  
    
    }

希望有人能帮助我,非常感谢。

解决方法

PubNub Java SDK 发布 sync

只需使用 sync 方法而不是 async

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

查看完整的PubNub SDK Java Docs for publish/sync

那应该为您做。 干杯!

,

使用同步很容易解决!但是如果你需要保持异步,我会在你得到结果后在异步函数结果中返回:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...