2017-03-27 4 views
1

は、私はいくつかのデータベースは非同期にそうように呼び出して作られた:Springブートトランザクション内でRxJava observableを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によって生成された新しいスレッドに渡され、接続は読み取り専用レプリカではなくマスタdbインスタンスに移動します。

現在ContextHandlersApp.javaContextAwareSchedulerHookを構成し使用しているが、私はそうRxJavaによって作成された新しいスレッドはThreadLocalの状態が定義されたトランザクション内でそれらを管理するために必要なものは何でも継承することを行うために何が必要ですか?

+0

スケジューラフックを使用してスレッドを別のスレッドにローカルにコピーすることができます。http://blog.mabn.pl/2014/11/rxjava-logback-and-mdc-threadlocal.html(RxJava 1の場合) – dwursteisen

+0

@ dwursteisenがありますが、春のJDBC状態でこれを具体的に行う方法を示すものは何ですか? –

答えて

0

dbQueryMethod@Transactional(readOnly=true)とマークし、同じクラスから直接ではなく、Springのautowiredプロキシ経由で呼び出すようにしてください。その後、ioスレッドは新しいトランザクションを開始し、読み取り専用になります。

関連する問題