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();
}
}
}