在不使用 block()/blockFirst()/blockLast() 的情况下将单声道转换为对象 java

convert mono to object java without using block()/blockFirst()/blockLast()

我想在不使用 block()/blockFirst()/blockLast() 的情况下将单声道转换为对象 java。请告诉我转换的方法。

官方路径是block(),这应该作为一个警告,你可能做错了什么,因为阻止non-blocking系统就像搬起石头砸自己的脚。

事实上,我们最近禁止在 Reactor 的某些 non-blocking Schedulers 上这样做,方法是在使用这些 API 时抛出异常:

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

如果你真的喜欢搬起石头砸自己的脚,总有.toFuture().get()的反模式解决方案... ¯\_(ツ)_/¯

我在 MongoDb document/model 上使用 ReactiveMongoDbRepository 和 Spring boot 2 中的 WebFlux 生成 sequence/id 时遇到了类似的错误。我有使用 .toFuture().get() 作为 non-blocking method/function.

的承诺来处理它
@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();
    }