控制器方法被调用后,发了一条消息到MQ,MQ消费后写入redis处理结果。
现在想要在控制器方法被调用后返回处理结果,目前的做法是死循环轮询判断redis有无结果,感觉好傻,有没有其他优雅的方案。
1.单任务处理
CompletableFuture.supplyAsync(() -> { // 处理逻辑结果返回给局部变量(集合) }}, threadPool).whenComplete((v, e) -> { // 执行完成返回局部变量(集合)结果 }
2.多任务处理
1.CompletableFuture<?>[] futures = list的处理结果// 阻塞list结果返回2.CompletableFuture.allOf(futures).join();
在这个场景中,要实现从异步到同步的转换,一种可能的解决方案是使用Java的CompletableFuture
。CompletableFuture
是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的操作,并返回一个CompletableFuture
。controllerMethod
方法在调用sendMessageToMQ
后,通过调用CompletableFuture
的get
方法来阻塞等待结果。这种方式可以实现从异步到同步的转换,同时避免了轮询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脚本,该脚本将在发生某些事件(例如生日提醒)时发送电子邮件。 请提出在不使用浏览器打开页面的情况下如何实现此目的。 问题答