【问题标题】:Java slack sdk client how to make the call asyncJava slack sdk客户端如何使调用异步
【发布时间】:2020-11-09 22:31:25
【问题描述】:

我正在尝试通过在 java 中使用 slack 的 sdk 客户端进行呼叫,以便使用电子邮件名称获取用户的 ID。松弛客户端返回CompletableFuture 对象。如果我使用 get() 方法,我可以获得 user_name,但据我了解,它是一个同步函数,它会使应用程序变慢。还有其他方法可以使此调用异步吗?

public static String lookUpUserId(String email) throws ExecutionException, InterruptedException {

       CompletableFuture<UsersLookupByEmailResponse> response = slackClient.usersLookupByEmail(r -> r
        .email(email));

       UsersLookupByEmailResponse data = response.get();

       return data.getUser().getId();
}

我尝试像这样使用 supplyFunc 和 thenApply,但它给出了一个错误,提示“缺少返回语句”,尽管我返回了一个值。我只是关心性能并且好奇是否有更好的方法来处理这个问题。谢谢

response.thenApply(r->r.getUser().getId());

【问题讨论】:

    标签: java spring http asynchronous


    【解决方案1】:

    由于调用返回CompletableFuture,它已经是异步的。是的,get() 方法是一个同步函数。使用它不会使应用程序变慢,它会使应用程序消耗更多内存。异步访问,如

       response.thenApply(r->r.getUser().getId());
    

    看起来正确。

    错误信息的原因是方法lookUpUserId被声明为返回字符串,所以必须有一个返回语句。如果要使其异步,则将其声明为返回CompletableFuture&lt;String&gt;并添加return语句

     return response.thenApply(r->r.getUser().getId());
    

    【讨论】:

    • 嗯同步不是意味着它会锁定主线程运行吗?因此,它会使其变慢,因为事情将无法并行运行。这是我的理解?
    • 事情总是可以并行运行的——只需创建更多线程。异步编程使用的线程数可能比普通多线程少,但并行化程度取决于算法是如何设计的,同一个算法可以用同步和异步两种方式表示。
    • 如果我实际使用 thenApply,CompletableFuture 没有按时完成,所以我无法从返回值中获取值。 @Alexei
    • 我想在 thenApply 之后我还需要使用 get() 吗?这种方式有效......但不确定这是否是异步的
    【解决方案2】:

    我不太了解 slack api,但可以在 in this answer 找到一些关于将您的函数存放在 implements Runnable 的类中的信息。

    Make your `CompletableFuture` in the constructor and run your gets in `run()`. 
    

    在我看来,从主线程处理所有 api 请求是一种最佳实践,但您应该知道,在一行的单独线程中运行一些单一的东西并在下一条线程中加入该线程只会在没有任何性能优势的情况下增加一点开销。 如果您正在处理一批请求,您应该在独立的线程上启动每个请求,然后将它们全部放在一起。


    我还注意到,我引用的答案并没有真正涵盖用于检索结果的线程连接,因此您可能还会发现 this 提供信息。如果你还没有学习过面向对象编程,那也没关系!你会是writing your own classes in no time。

    Edit: Ask for code if you need it, It's better if you write it yourself.
    

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多