当前位置: 首页 > 知识库问答 >
问题:

project reactor中的包装阻塞I/O

澹台权
2023-03-14

我有一个spring-webflux API,它在服务层需要从使用JDBC的现有存储库中读取。

在对这个主题进行了一些阅读之后,我希望将阻塞数据库调用的执行与我的非阻塞异步代码的其余部分分开。

我定义了一个专用的jdbcScheduler:

@Bean
public Scheduler jdbcScheduler() {
    return Schedulers.fromExecutor(Executors.newFixedThreadPool(maxPoolSize));
}
@Component
public class AsyncJdbcWrapper {

    private final Scheduler jdbcScheduler;

    @Autowired
    public AsyncJdbcWrapper(Scheduler jdbcScheduler) {

        this.jdbcScheduler = jdbcScheduler;
    }

    public <T> Mono<T> async(Callable<T> callable) {
        return Mono.fromCallable(callable)
                .subscribeOn(jdbcScheduler)
                .publishOn(Schedulers.parallel());
    }
}
Mono<Integer> userIdMono = asyncWrapper.async(() -> userDao.getUserByUUID(request.getUserId()))
                .map(userOption -> userOption.map(u -> u.getId())
                        .orElseThrow(() -> new IllegalArgumentException("Unable to find user with ID " + request.getUserId())));

2)假设我想利用得到的mono,例如调用带有userIdMono结果的API,它将在哪个调度器上执行?是专门为jdbc调用创建的调度器,还是reactor通常在其中操作的主(?)线程?例如。

userIdMono.map(id -> someApiClient.call(id));

共有1个答案

董花蜂
2023-03-14

1)使用subscribeon可以正确地将JDBC工作放在JDBCScheduler

2)都不是,当callable的结果在jdbcScheduler上计算时,是发布在并行调度器上,因此您的映射将在调度器.parallel()池的线程上执行(而不是占用jdbcScheduler)。

 类似资料:
  • 问题内容: 非阻塞TCP / IP S和在NIO帮我处理与小数目的线程许多TCP / IP连接。但是UDP 呢?(我必须承认我对UDP不太熟悉。) 即使UDP发送操作未在阻止模式下运行,它似乎也不会阻止。确实存在因拥堵或类似原因导致阻塞的情况吗?我真的很好奇,是否存在这样的情况以及生产环境中可能存在的情况。 如果实际上并没有阻塞,并且我不打算使用已连接并仅绑定到一个端口,那么使用非阻塞模式和and

  • 我正在尝试使用Tokio包装一个同步MQTT客户机库。代码需要通过通道连续接收消息,并将它们发送到异步代码中。我了解如何使用包装返回单个值的代码。但是如何将此应用于包装从通道连续接收消息的循环?

  • 现在我们知道如何在一个指定I/O调度器上来调度一个任务,我们可以修改storeBitmap()函数并再次检查StrictMode的不合规做法。为了这个例子,我们可以在新的blockingStoreBitmap()函数中重排代码。 private static void blockingStoreBitmap(Context context, Bitmap bitmap, String filena

  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全

  • 阻塞I/O的操作会导致App必须等待结果返回(阻塞结束)才能进行下一步操作。在UI线程上执行一个阻塞操作会将UI强行卡住,直接造成很糟糕的用户体验。 我们激活StrictMode后,我们开始收到了关于我们的App错误操作磁盘I/O的不良信息。 D/StrictMode StrictMode policy violation; ~duration=998 ms: android.os.Strict

  • 我正在使用Spring云平台开发微服务,其中service1调用多个其他微服务,例如service2、service3、Service4等。这些服务可以并行调用,service1将聚合结果。我能用春云伪装吗(http://cloud.spring.io/spring-cloud-static/Dalston.SR1/#spring-cloud Faign)生成rest客户端并异步调用服务,还是应该