java代码我这样的场景如何异步转同步?

控制器方法被调用后,发了一条消息到MQ,MQ消费后写入redis处理结果。
现在想要在控制器方法被调用后返回处理结果,目前的做法是死循环轮询判断redis有无结果,感觉好傻,有没有其他优雅的方案。


回答:

首先我觉得轮询也并不是不能接受的方案,很多时候外部程序就是没办法回调,这种情况下轮询也没什么不好。
然后来到你这个场景,我理解你应该是想优雅地实现一个异步过程的回调。我猜你现在的做法是控制器发消息到MQ后,控制器的线程持续轮询redis看是否有结果,直到有结果或超时才返回。这种情况下,可以考虑让当前线程阻塞,通过消费者的行为通知到本地,比如使用redis的pub/sub,或者消费者写一个处理完成的消息到MQ,再由消费到这个消息的线程唤起阻塞线程。
我之前做过一个异步过程是本地程序另起一个http接口用来接收完成消息,控制器启动异步过程后让线程阻塞在一个对象上,异步过程结束的最后会通过这个额外的接口接收成功消息。等另起的接口收到请求后,找到之前用来阻塞的那个对象,唤醒阻塞在对象上的线程即可。


回答:

1.单任务处理

 CompletableFuture.supplyAsync(() -> {

// 处理逻辑结果返回给局部变量(集合)

}}, threadPool).whenComplete((v, e) -> {

// 执行完成返回局部变量(集合)结果

}

2.多任务处理

1.CompletableFuture<?>[] futures = list的处理结果

// 阻塞list结果返回

2.CompletableFuture.allOf(futures).join();


回答:

优雅点,有时间可以搞一个简单的webSocket,MQ异步消费成功写入rerdis后,直接发送推送结果给前端

以上是 java代码我这样的场景如何异步转同步? 的全部内容, 来源链接: utcz.com/p/945507.html

回到顶部