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

3b6akqbq  于 11个月前  发布在  Spring
关注(0)|答案(3)|浏览(201)

我想将mono转换为java对象,而不使用block()/blockFirst()/blockLast()。请告诉我转换方法。

5sxhfpxr

5sxhfpxr1#

官方路径是block(),这应该是一个警告,提醒你可能做错了什么,因为阻止一个非阻止系统就像是在自己的脚上开枪。
事实上,我们最近禁止在Reactor的一些非阻塞Schedulers上这样做,在使用这些API时抛出异常:

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

字符串
如果您真的想搬起石头砸自己的脚,那么总有.toFuture().get(). ¯\_(ツ)_/¯的反模式解决方案

k4ymrczo

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

字符串

h7wcgrx3

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

字符串

相关问题