响应式编程中如何从Mono类型中返回int类型值
问题原因
Mono是Reactor框架提供的异步响应式容器,map属于容器操作符,执行后返回的依然是Mono<T>类型,不会直接返回容器内存储的实际值,因此你直接将counter.map(u -> u.getSeq())赋值给int变量,必然会出现类型不匹配错误。- 你使用的
subscribe是异步回调逻辑,调用后会立刻返回,不会等待MongoDB操作执行完成,回调逻辑执行前你读取自定义的cs对象中的seq属性,大概率拿不到正确结果。 - 原代码末尾的三元表达式两个分支返回值类型不兼容,int类型和字符串
"1"不能混用,本身存在语法错误。
解决方案
方案1:同步阻塞返回int类型
如果你确实需要方法同步返回int类型,可以使用block()方法阻塞当前线程,等待Mono执行完成后拿到内部的实际值:
public int getNextSequence(String seqName) { Mono<CustomSequences> counter = reactiveMongoOperations.findAndModify( query(where("_id").is(seqName)), new Update().inc("seq", 1), options().returnNew(true).upsert(true), CustomSequences.class); Integer seq = counter.map(CustomSequences::getSeq).block(); // 空值默认返回int类型的1 return seq != null ? seq : 1; }
注意:block()方法不能在响应式流的核心调度线程中调用,否则会抛出阻塞非法异常,仅适合非响应式上下文调用的场景。
方案2:符合响应式规范的异步实现
如果是在响应式编程场景下使用,建议方法直接返回Mono<Integer>,避免不必要的阻塞:
public Mono<Integer> getNextSequence(String seqName) { return reactiveMongoOperations.findAndModify( query(where("_id").is(seqName)), new Update().inc("seq", 1), options().returnNew(true).upsert(true), CustomSequences.class) .map(CustomSequences::getSeq) // 空值默认返回1 .defaultIfEmpty(1); }
内容的提问来源于stack exchange,提问作者cafff
相关产品推荐
相关产品推荐

