在Spring启动事务中以只读方式执行RxJava observable?

在Spring启动事务中以只读方式执行RxJava observable?,java,spring,jdbc,spring-boot,rx-java,Java,Spring,Jdbc,Spring Boot,Rx Java,在我的spring boot应用程序中,我异步调用了几个数据库,如下所示: public List<Results> doWork() { List<Observable<Results>> observables = Lists.newArrayList(); observables.add( Observable.fromCallable(() -> dbQueryMethod(param1)).

在我的spring boot应用程序中,我异步调用了几个数据库,如下所示:

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();
}
public List doWork(){
List observables=Lists.newArrayList();
可观察的。添加(
Observable.fromCallable(()->dbQueryMethod(param1)).subscribeOn(Schedulers.io());
可观察的。添加(
Observable.fromCallable(()->dbQueryMethod(param2)).subscribeOn(Schedulers.io());
返回可观测值。合并(可观测值)
托利斯先生()
.toBlocking()
.single();
}
@事务(只读=真)
公共列表myServiceMethod(){
销钉();
}
基本上,问题在于,尽管将我的服务层方法标记为transaction&read only设置为true,但它实际上并没有将ThreadLocal状态传递给RxJava生成的新线程,导致连接转到我的master db实例,而不是读取副本


我们目前正在
App.java
中使用配置的
ContextHandlers
ContextAwareSchedulerHook
,但是我需要做什么才能使RxJava创建的新线程继承在定义的事务中管理它们所需的ThreadLocal状态呢?

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

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

您可以使用ScheduleHook将您的线程本地复制到另一个线程,请参阅(对于RxJava 1)@dwursteisen但是有没有任何东西说明如何专门针对spring JDBC状态执行此操作?您可以使用ScheduleHook将您的线程本地复制到另一个线程,请参阅(对于RxJava 1)@dwursteisen但是有没有任何东西说明如何专门针对spring JDBC状态执行此操作?