我正在运行RxJava并创建一个使用onNext()
方法生成数据的主题。我正在使用 Spring 。
这是我的设置:
@Component
public class SubjectObserver {
private SerializedSubject<SomeObj, SomeObj> safeSource;
public SubjectObserver() {
safeSource = PublishSubject.<SomeObj>create().toSerialized();
**safeSource.subscribeOn(<my taskthreadExecutor>);**
**safeSource.observeOn(<my taskthreadExecutor>);**
safeSource.subscribe(new Subscriber<AsyncRemoteRequest>() {
@Override
public void onNext(AsyncRemoteRequest asyncRemoteRequest) {
LOGGER.debug("{} invoked.", Thread.currentThread().getName());
doSomething();
}
}
}
public void publish(SomeObj myObj) {
safeSource.onNext(myObj);
}
}
在RxJava流上生成新数据的方式是@Autowire private SubjectObserver subjectObserver
然后调用subjectObserver.publish(newDataObjGenerated)
无论我为subscribeOn()
&amp; observeOn()
:
onNext()
及其中的实际工作是在实际调用主题onNext()
的同一线程上完成的,以生成/生成数据。
这是对的吗?如果是这样,我错过了什么?我期待doSomething()
可以在另一个线程上完成。
更新
在我的调用类中,如果我改变了调用publish
方法的方式,那么当然会为订阅者分配一个新线程来运行。
taskExecutor.execute(() -> subjectObserver.publish(newlyGeneratedObj));
谢谢,
答案 0 :(得分:5)
Observable
/ Subject
上的每个操作符都会返回一个带有额外行为的新实例,但是,您的代码只会应用subscribeOn
和observeOn
,然后抛弃它们生成的任何内容并订阅原始Subject
。你应该链接方法调用然后订阅:
safeSource = PublishSubject.<AsyncRemoteRequest>create().toSerialized();
safeSource
.subscribeOn(<my taskthreadExecutor>)
.observeOn(<my taskthreadExecutor>)
.subscribe(new Subscriber<AsyncRemoteRequest>() {
@Override
public void onNext(AsyncRemoteRequest asyncRemoteRequest) {
LOGGER.debug("{} invoked.", Thread.currentThread().getName());
doSomething();
}
});
请注意,subscribeOn
对PublishSubject
没有实际影响,因为subscribe()
方法中没有订阅副作用。