2017-03-27 17 views
1

在我的春天启动程序,我提出了一些数据库调用异步像这样:在Spring引导事务中执行RxJava observable as readOnly?

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

基本问题是,尽管标记我的服务层方法,交易&只读设置为true,它实际上没有通过ThreadLocal的状态到由RxJava产生的新线程,导致连接转到我的主数据库实例而不是只读副本。

我们目前使用的配置ContextHandlersApp.java一个ContextAwareSchedulerHook,但什么做我需要做的,这样通过RxJava创建的新的线程将继承任何ThreadLocal的状态是需要定义的事务中进行管理?

+0

您可以使用SchedulerHook将本地线程复制到另一个线程,请参阅http://blog.mabn.pl/2014/11/rxjava-logback-and-mdc-threadlocal.html(适用于RxJava 1) – dwursteisen

+0

@ dwursteisen,但是有没有什么表明如何特别为spring JDBC状态做这件事? –

回答

0

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