在Spring启动事务中执行RxJava observable作为readOnly?

时间:2017-03-27 23:10:51

标签: java spring jdbc spring-boot rx-java

在我的春季启动应用程序中,我异步进行了几次数据库调用:

public List<Results> doWork() {
        List<Observable<Results>> observables = Lists.newArrayList();

        observables.add(
          Observable.fromCallable(() -> dbQueryMethod(param1)).subscribeOn(Schedulers.io()));

        observables.add(
          Observable.fromCallable(() -> dbQueryMethod(param2)).subscribeOn(Schedulers.io()));

        return Observable.merge(observables)
                    .toList()
                    .toBlocking()
                    .single();
}

@Transactional(readOnly=true)
public List<Results> myServiceMethod() {
    doWork();
}

基本上问题在于尽管将我的服务层方法标记为事务&amp; read read设置为true,它实际上并没有将ThreadLocal状态传递给RxJava产生的新线程,导致连接进入我的主数据库实例而不是只读副本。

我们目前在ContextHandlers中使用已配置的ContextAwareSchedulerHookApp.java,但我需要做什么才能使RxJava创建的新线程继承所需的ThreadLocal状态在定义的交易中管理它们吗?

1 个答案:

答案 0 :(得分:0)

将您的dbQueryMethod标记为@Transactional(readOnly=true),并确保通过Spring自动连接代理(不是直接来自同一个类)调用它。然后io线程将启动新事务,这将是只读的。