reactivex.Observable 超时问题

下面代码测试可知:超时设置需要在map之后才有效,换句话说就是,超时只对超时设置之前的代码有用

复制代码
import io.reactivex.Observable;
import java.util.concurrent.TimeUnit;

public class TimeoutTest {

    public static void main(String[] args) throws InterruptedException {
        TimeoutTest test = new TimeoutTest();

        System.out.println("=== 测试超时任务 ===");
        test.testTimeout();

        System.out.println("\n=== 测试正常任务 ===");
        test.testNormal();

        System.out.println("\n=== 测试长任务 ===");
        test.testLongTask();

        // 确保主线程不退出
        Thread.sleep(5000);
    }

    // 测试超时任务
    public void testTimeout() {
            Observable.create(emitter -> {
                        System.out.println("超时任务模拟:执行开始...");
//                        Thread.sleep(2000); // 模拟超长时间任务(超过1秒)
                        emitter.onNext("任务完成");
                        emitter.onComplete();
                    })
                    .map(s->{
                            Thread.sleep(4000); // 模拟超长时间任务(超过1秒)
                            System.out.println("处理s0!");
                        return s + "x";
                    })
                    .timeout(3, TimeUnit.SECONDS) // 设置超时时间为1秒
                    .onErrorResumeNext(throwable -> {
                        if (throwable instanceof java.util.concurrent.TimeoutException) {
                            System.out.println("任务处理超时:跳过当前任务!");
                        } else {
                            System.err.println("任务发生其他异常:" + throwable.getMessage());
                        }
                        return Observable.empty(); // 返回空的Observable,继续处理其他任务
                    })
                    .subscribe(
                            result -> System.out.println("结果: " + result),
                            throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                            () -> System.out.println("任务已完成")
                    );

    }

    // 测试正常任务
    public void testNormal() {
        Observable.create(emitter -> {
                    System.out.println("正常任务模拟:执行开始...");
                    Thread.sleep(500); // 模拟快速任务(小于1秒)
                    emitter.onNext("任务完成");
                    emitter.onComplete();
                })
                .timeout(1, TimeUnit.SECONDS) // 设置超时时间为1秒
                .onErrorResumeNext(throwable -> {
                    System.err.println("任务超时或其他异常:" + throwable.getMessage());
                    return Observable.empty();
                })
                .subscribe(
                        result -> System.out.println("结果: " + result),
                        throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                        () -> System.out.println("任务已完成")
                );
    }

    // 测试长时间任务
    public void testLongTask() {
        Observable.create(emitter -> {
                    System.out.println("长时间任务模拟:执行开始...");
                    for (int i = 0; i < 5; i++) {
                        System.out.println("任务进行中: Step " + (i + 1));
                        Thread.sleep(600); // 模拟分段任务,每次处理600ms
                        emitter.onNext("Step " + (i + 1));
                    }
                    emitter.onComplete();
                })
                .timeout(1, TimeUnit.SECONDS) // 设置超时时间为1秒
                .onErrorResumeNext(throwable -> {
                    if (throwable instanceof java.util.concurrent.TimeoutException) {
                        System.out.println("任务处理超时:跳过当前任务!");
                    } else {
                        System.err.println("任务发生其他异常:" + throwable.getMessage());
                    }
                    return Observable.empty(); // 返回空的Observable,继续处理其他任务
                })
                .subscribe(
                        result -> System.out.println("结果: " + result),
                        throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                        () -> System.out.println("任务已完成")
                );
    }
}
相关推荐
许彰午4 天前
政务低代码平台实战(总纲)——从元数据引擎到可视化设计器的五个关键决策
低代码·rxjava·政务
只会cv的小前端8 天前
七巧低代码服务端脚本使用方法
android·低代码·rxjava
weixin_7275356213 天前
Loop 已死,Graph 新生:AI 工作流的范式革命
android·人工智能·rxjava
缓慢更新17 天前
低代码CRM系统架构设计:从数据层到表现层的完整技术方案
低代码·系统架构·rxjava
ebok.21 天前
低代码新潮流:京微智枢AI+低代码平台引领企业数智化变革
人工智能·低代码·rxjava
cn分享汇21 天前
2026 企业 AI 平台:低代码融合赛道
人工智能·低代码·rxjava
额恩661 个月前
AI 智能体从零搭建实战教程——扣子
android·rxjava·coze
想你依然心痛1 个月前
AtomCode Skills 开发实战:从零编写自定义斜杠命令
rxjava·插件开发·自定义命令·扩展能力·skill.md·skills 开发
想你依然心痛1 个月前
AIoT网关架构:协议转换、边缘推理与云端协同
工业物联网·数据流·协议转换·aiot网关·边缘推理·云端协同·模型分发
想你依然心痛1 个月前
固件架构演进:从裸机到RTOS到Linux的决策矩阵——复杂度、实时性、成本三维解析
架构·嵌入式·响应式编程·数据流·流处理·资源控制·背压