当前位置: 首页 > 知识库问答 >
问题:

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

廖诚
2024-01-05

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

共有2个答案

邬弘化
2024-01-05

1.单任务处理

 CompletableFuture.supplyAsync(() -> {        // 处理逻辑结果返回给局部变量(集合) }}, threadPool).whenComplete((v, e) -> {        // 执行完成返回局部变量(集合)结果 }

2.多任务处理

1.CompletableFuture<?>[] futures = list的处理结果// 阻塞list结果返回2.CompletableFuture.allOf(futures).join(); 
卫博学
2024-01-05

在这个场景中,要实现从异步到同步的转换,一种可能的解决方案是使用Java的CompletableFutureCompletableFuture是Java 8引入的一个功能,它允许你以非阻塞的方式编写异步代码,并提供了优雅的方法来处理异步操作的结果。

下面是一个示例代码,展示了如何使用CompletableFuture来异步发送消息到MQ,并在接收到处理结果后同步返回:

import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class AsyncToSyncExample {    // 假设有一个方法用于向MQ发送消息并返回一个CompletableFuture    public static CompletableFuture<String> sendMessageToMQ(String message) {        // 模拟异步发送消息到MQ        return CompletableFuture.supplyAsync(() -> {            // 模拟处理时间            try {                Thread.sleep(3000); // 假设处理需要3秒钟            } catch (InterruptedException e) {                throw new RuntimeException("Interrupted while processing message", e);            }            // 模拟处理结果            return "Processed result: " + message;        });    }    // 控制器方法,异步发送消息并同步返回处理结果    public static String controllerMethod(String inputMessage) throws ExecutionException, InterruptedException {        CompletableFuture<String> future = sendMessageToMQ(inputMessage);        // 使用CompletableFuture的get方法阻塞等待结果        return future.get();    }    public static void main(String[] args) throws Exception {        String result = controllerMethod("Hello MQ");        System.out.println("Result: " + result);    }}

在上面的示例中,sendMessageToMQ方法模拟了异步发送消息到MQ的操作,并返回一个CompletableFuturecontrollerMethod方法在调用sendMessageToMQ后,通过调用CompletableFutureget方法来阻塞等待结果。这种方式可以实现从异步到同步的转换,同时避免了轮询Redis的笨拙做法。

 类似资料:
  • 使用djanog的异步如何改写下边这段代码:

  • 问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身

  • 主要内容:1 什么是Java同步代码块,2 Java同步代码块的要点,3 Java同步代码块的语法,4 Java同步代码块的例子1,5 Java同步代码块的例子21 什么是Java同步代码块 同步代码块可用于对方法的任何特定资源执行同步。 假设您的方法中有50行代码,但是您只想同步5行,则可以使用synchronized代码块。 如果将方法的所有代码放在同步代码块中,它的效果与同步方法相同。 2 Java同步代码块的要点 同步代码块用于锁定任何共享资源的对象。 同步代码块的范围小于该方法。 3 

  • 使用Mocha测试异步代码并不简单!只需在测试完成后调用回调。通过添加一个回调(通常命名done)it(),Mocha将知道它应该等待调用此函数来完成测试。此回调接受Error实例(或其子类)或伪值; 其他任何事情都会导致测试失败。 describe('User', function() { describe('#save()', function() { it('should save wi

  • 问题内容: 如何不等待就异步运行PHP代码?我有一个长期运行(几乎无限),应该在服务器启动时运行,并且应该异步处理而无需等待。 我猜可能的选择是: 在网页中运行代码并保持打开状态以执行该任务 从某些在后台处理的命令行实用程序(我不确定如何)调用脚本。 我在本地服务器上运行PHP脚本,该脚本将在发生某些事件(例如生日提醒)时发送电子邮件。 请提出在不使用浏览器打开页面的情况下如何实现此目的。 问题答