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产生的新线程,导致连接转到我的主数据库实例而不是只读副本。
我们目前使用的配置ContextHandlers
和App.java
一个ContextAwareSchedulerHook
,但什么做我需要做的,这样通过RxJava创建的新的线程将继承任何ThreadLocal的状态是需要定义的事务中进行管理?
您可以使用SchedulerHook将本地线程复制到另一个线程,请参阅http://blog.mabn.pl/2014/11/rxjava-logback-and-mdc-threadlocal.html(适用于RxJava 1) – dwursteisen
@ dwursteisen,但是有没有什么表明如何特别为spring JDBC状态做这件事? –