我想将mono转换为java对象,而不使用block()/blockFirst()/blockLast()。请告诉我转换方法。
5sxhfpxr1#
官方路径是block(),这应该是一个警告,提醒你可能做错了什么,因为阻止一个非阻止系统就像是在自己的脚上开枪。事实上,我们最近禁止在Reactor的一些非阻塞Schedulers上这样做,在使用这些API时抛出异常:
block()
Schedulers
java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread parallel-1
字符串如果您真的想搬起石头砸自己的脚,那么总有.toFuture().get(). ¯\_(ツ)_/¯的反模式解决方案
.toFuture().get()
¯\_(ツ)_/¯
k4ymrczo2#
我在Sping Boot 2中使用ReactiveMongoDbRepository和WebFlux在MongoDb文档/模型上生成sequence/id时遇到了类似的错误。我已经使用.toFuture().get()作为非阻塞方法/函数的承诺来处理它。
@Override public long generateSequence(final String sequenceName) throws InterruptedException, ExecutionException { return mongoOperations.findAndModify(new Query(Criteria.where("_id").is(sequenceName)), new Update().inc("sequence", 1), DatabaseSequence.class).doOnSuccess(object -> { logger.debug("databaseSequence is evaluated: {}", object); }).toFuture().get().getSequence(); }
字符串
h7wcgrx33#
decompose你想要保存Mono的值的字段在方法之外。使用subscribe()来获取值并赋值给你声明的变量。检查下面的代码并注解查询。这对我有用。希望这对你有帮助。请建议是否要对这种方法进行更正
private ExpenseEntity expenseEntity1; private UserEntity payerEntity1; private Double amountSpent; // SPLIT CALCULATION public Mono<Map<Long, Double>> findSplit(SplitDTO splitDTO) { Mono<ExpenseEntity> expenseEntity = expensePersistence.findExpenseById(splitDTO.getExpenseId()); expenseEntity.subscribe(expense -> { expenseEntity1= expense; amountSpent = expense.getAmount(); }); Mono<UserEntity> payerEntity = userPersistence.findUserById(splitDTO.getPayerId()); payerEntity.subscribe(payer -> { payerEntity1 = payer; } );
3条答案
按热度按时间5sxhfpxr1#
官方路径是
block()
,这应该是一个警告,提醒你可能做错了什么,因为阻止一个非阻止系统就像是在自己的脚上开枪。事实上,我们最近禁止在Reactor的一些非阻塞
Schedulers
上这样做,在使用这些API时抛出异常:字符串
如果您真的想搬起石头砸自己的脚,那么总有
.toFuture().get()
.¯\_(ツ)_/¯
的反模式解决方案k4ymrczo2#
我在Sping Boot 2中使用ReactiveMongoDbRepository和WebFlux在MongoDb文档/模型上生成sequence/id时遇到了类似的错误。我已经使用
.toFuture().get()
作为非阻塞方法/函数的承诺来处理它。字符串
h7wcgrx33#
decompose你想要保存Mono的值的字段在方法之外。使用subscribe()来获取值并赋值给你声明的变量。检查下面的代码并注解查询。这对我有用。希望这对你有帮助。请建议是否要对这种方法进行更正
字符串