响应式编程Reactor优化Callback回调地狱

1. Reactor是什么

  • Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux(表示一个包含零到多个元素的异步序列)和 Mono表示一个包含零或一个元素的异步序列)。
  • Reactor 通过提供响应式的操作符,如mapfilterflatMap等,使得开发者能够方便地进行数据流的转换和处理。

2. Reactor、Callback、CompletableFuture三种形式异步编码对比

  • 编码简洁程度Reactor最优
  • Reactor线程利用率最高(因实现了Reactive Streams规范,拥有背压+事件驱动特性,此处暂不展开)

代码如下:

pom依赖

xml 复制代码
<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>io.projectreactor</groupId>
           <artifactId>reactor-bom</artifactId>
           <version>2023.0.0</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

<dependencies>
   <dependency>
       <groupId>io.projectreactor</groupId>
       <artifactId>reactor-core</artifactId>
   </dependency>
</dependencies>

Callback回调地狱

java 复制代码
interface FirstCallback {
    void onCompleteFirst(String result);

    void onErrorFirst(Exception e);
}

interface SecondCallback {
    void onCompleteSecond(String result);

    void onErrorSecond(Exception e);
}

interface ThirdCallback {
    void onCompleteThird(String result);

    void onErrorThird(Exception e);
}

class AsyncOperations {
    static void firstOperation(FirstCallback firstCallback) {
        new Thread(() -> {
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                // 操作完成后调用回调函数
                firstCallback.onCompleteFirst("First operation completed");
            } catch (Exception e) {
                // 发生异常时调用错误回调
                firstCallback.onErrorFirst(e);
            }
        }).start();
    }

    static void secondOperation(String input, SecondCallback secondCallback) {
        new Thread(() -> {
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                // 操作完成后调用回调函数
                secondCallback.onCompleteSecond("Second operation completed with input: " + input);
            } catch (Exception e) {
                // 发生异常时调用错误回调
                secondCallback.onErrorSecond(e);
            }
        }).start();
    }

    static void thirdOperation(String input, ThirdCallback thirdCallback) {
        new Thread(() -> {
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                // 操作完成后调用回调函数
                thirdCallback.onCompleteThird("Third operation completed with input: " + input);
            } catch (Exception e) {
                // 发生异常时调用错误回调
                thirdCallback.onErrorThird(e);
            }
        }).start();
    }
}

public class CallbackHellExample {
    public static void main(String[] args) {
        AsyncOperations.firstOperation(new FirstCallback() {
            @Override
            public void onCompleteFirst(String result) {
                System.out.println("First Callback: " + result);

                // 第一次操作完成后调用第二次操作
                AsyncOperations.secondOperation(result, new SecondCallback() {
                    @Override
                    public void onCompleteSecond(String result) {
                        System.out.println("Second Callback: " + result);

                        // 第二次操作完成后调用第三次操作
                        AsyncOperations.thirdOperation(result, new ThirdCallback() {
                            @Override
                            public void onCompleteThird(String result) {
                                System.out.println("Third Callback: " + result);
                            }

                            @Override
                            public void onErrorThird(Exception e) {
                                System.out.println("Error in Third Callback: " + e.getMessage());
                            }
                        });
                    }

                    @Override
                    public void onErrorSecond(Exception e) {
                        System.out.println("Error in Second Callback: " + e.getMessage());
                    }
                });
            }

            @Override
            public void onErrorFirst(Exception e) {
                System.out.println("Error in First Callback: " + e.getMessage());
            }
        });

        // 主线程继续执行其他操作
        System.out.println("Main thread continues...");
    }
}

CompletableFuture优化Callback回调地狱

java 复制代码
public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<String> firstOperation = CompletableFuture.supplyAsync(() -> {
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                return "First operation completed";
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        CompletableFuture<String> secondOperation = firstOperation.thenApplyAsync(result -> {
            System.out.println("First CompletableFuture: " + result);
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                return "Second operation completed with input: " + result;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        CompletableFuture<String> thirdOperation = secondOperation.thenApplyAsync(result -> {
            System.out.println("Second CompletableFuture: " + result);
            try {
                // 模拟异步操作
                Thread.sleep(2000);
                return "Third operation completed with input: " + result;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        thirdOperation.whenComplete((result, throwable) -> {
            if (throwable == null) {
                System.out.println("Third CompletableFuture: " + result);
            } else {
                System.out.println("Error in CompletableFuture: " + throwable.getMessage());
            }
        });

        // 主线程继续执行其他操作
        System.out.println("Main thread continues...");

        // 等待所有操作完成
        CompletableFuture.allOf(firstOperation, secondOperation, thirdOperation).join();
    }
}

Reactor优化Callback回调地狱

java 复制代码
public class ReactorOptimizedExample {
    public static void main(String[] args) {
        Mono.fromCallable(() -> {
                    // 模拟异步操作
                    Thread.sleep(2000);
                    return "First operation completed";
                })
                .subscribeOn(Schedulers.boundedElastic())
                .flatMap(result -> {
                    System.out.println("First Reactor: " + result);
                    return Mono.fromCallable(() -> {
                        // 模拟异步操作
                        Thread.sleep(2000);
                        return "Second operation completed with input: " + result;
                    }).subscribeOn(Schedulers.boundedElastic());
                })
                .flatMap(result -> {
                    System.out.println("Second Reactor: " + result);
                    return Mono.fromCallable(() -> {
                        // 模拟异步操作
                        Thread.sleep(2000);
                        return "Third operation completed with input: " + result;
                    }).subscribeOn(Schedulers.boundedElastic());
                })
                .doOnSuccess(result -> System.out.println("Third Reactor: " + result))
                .doOnError(error -> System.out.println("Error in Reactor: " + error.getMessage()))
                .block(); // 阻塞等待操作完成

        // 主线程继续执行其他操作
        System.out.println("Main thread continues...");
    }
}

学习打卡:Java学习笔记-day06-响应式编程Reactor优化Callback回调地狱

相关推荐
我命由我123454 分钟前
SSL 协议(HTTPS 协议的关键)
网络·经验分享·笔记·学习·https·ssl·学习方法
wrx繁星点点6 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程14 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程31 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子36 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
几何心凉43 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
丶Darling.44 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
华农第一蒟蒻1 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷1 小时前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis