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

时间:2019-06-10 07:10:05

标签: spring project-reactor

我想不使用block()/ blockFirst()/ blockLast()将单声道转换为对象java。请告诉我转换方式。

2 个答案:

答案 0 :(得分:1)

在Spring Boot 2中使用ReactiveMongoDbRepository和WebFlux在MongoDb文档/模型上生成序列/ id时,我遇到了类似的错误。我已经使用.toFuture().get()处理了它,作为对非阻塞方法/函数的承诺。 / p>

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

答案 1 :(得分:0)

官方路径为block(),这应该警告您可能做错了,因为阻止非阻止系统就像是在用脚射击自己。

实际上是如此之多,以至于我们最近在使用这些API时抛出异常,从而禁止在Reactor的某些非阻塞Schedulers上这样做:

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

如果您真的很喜欢在脚上开枪,那么总有.toFuture().get() ... ¯\_(ツ)_/¯的反模式解决方案