非阻塞响应式编码

import reactor.core.publisher.Mono;  
import java.time.Duration;  
import java.util.concurrent.TimeUnit;  
  
public class ReactiveExample {  
  
    // 模拟数据处理过程,包含阻塞I/O操作  
    private static Mono<String> processData(String data) {  
        // 使用Mono.fromCallable来包装一个Callable,Callable中可以执行阻塞操作  
        // 这里我们使用Thread.sleep来模拟阻塞  
        return Mono.fromCallable(() -> {  
            // 模拟耗时的I/O操作,比如从数据库读取数据  
            try {  
                TimeUnit.SECONDS.sleep(1); // 假设这个操作耗时1秒  
            } catch (InterruptedException e) {  
                Thread.currentThread().interrupt(); // 恢复中断状态  
                throw new RuntimeException("Blocking operation interrupted", e);  
            }  
            return "Processed " + data; // 返回处理后的数据  
        })  
        .delayElement(Duration.ZERO); // 这里不需要额外的delay,因为Callable已经模拟了耗时  
    }  
  
    public static void main(String[] args) {  
        // 订阅processData返回的Mono,并打印结果  
        processData("Hello, Reactor!")  
            .subscribe(  
                result -> System.out.println(result), // 成功的回调  
                error -> System.err.println("Error: " + error.getMessage()), // 错误的回调  
                () -> System.out.println("Completed") // 完成的回调(对于Mono,这通常意味着成功完成且没有值)  
            );  
  
        // 注意:在main方法中,你可能需要添加一些代码来阻止程序立即退出,  
        // 因为异步操作可能在main方法结束之前还没有完成。  
        // 一个简单的方法是调用Thread.sleep,但这通常不是最佳实践。  
        // 在实际应用中,你可能会有一个Web服务器或长时间运行的应用程序来承载这些异步操作。  
        // 为了演示目的,我们可以添加以下代码来模拟等待:  
        try {  
            TimeUnit.SECONDS.sleep(2); // 等待足够长的时间以确保异步操作完成  
        } catch (InterruptedException e) {  
            Thread.currentThread().interrupt();  
        }  
    }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Addison_Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值