不使用block()/blockFirst()/blockLast()将mono转换为java对象

问题描述 投票:0回答:3

我想在不使用block()/blockFirst()/blockLast()的情况下将mono转换为object java。请告诉我转换的方法。

spring project-reactor
3个回答
3
投票

官方路径是

block()
,这应该作为你可能做错了什么的警告,因为阻止非阻塞系统就像搬起石头砸自己的脚。

事实上,我们最近禁止在 Reactor 的一些非阻塞

Schedulers
上这样做,在使用这些 API 时会抛出异常:

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread parallel-1

如果你真的喜欢搬起石头砸自己的脚,总有

.toFuture().get()
的反模式解决方案...
¯\_(ツ)_/¯


3
投票

在 Spring boot 2 中使用 ReactiveMongoDbRepository 和 WebFlux 在 MongoDb 文档/模型上生成序列/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();
    }

0
投票

在方法外声明要保存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;
                               }
        );
© www.soinside.com 2019 - 2024. All rights reserved.