Spring 在不同的线程rxJava上运行PublishSubject
我正在运行RxJava并创建一个主题,以使用Spring 在不同的线程rxJava上运行PublishSubject,spring,rx-java,subject-observer,Spring,Rx Java,Subject Observer,我正在运行RxJava并创建一个主题,以使用onNext()方法生成数据。我正在使用Spring 这是我的设置: @Component public class SubjectObserver { private SerializedSubject<SomeObj, SomeObj> safeSource; public SubjectObserver() { safeSource = PublishSubject.<SomeObj>crea
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);
}
}
谢谢,在
observeable
/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();
}
});
safeSource=PublishSubject.create().toSerialized();
安全来源
.subscribeOn()
.observeOn()
.subscribe(新订户(){
@凌驾
public void onNext(异步远程请求异步远程请求){
debug(“{}已调用。”,Thread.currentThread().getName());
doSomething();
}
});
请注意,
subscribeOn
对PublishSubject
没有实际影响,因为它的subscribe()
方法中没有发生订阅副作用。可观察的/Subject
上的每个操作符返回一个具有额外行为的新实例,您的代码只需应用subscribeOn
和observeOn
,然后丢弃它们生成的任何内容,并订阅原始主题。您应该链接方法调用,然后订阅:
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();
}
});
safeSource=PublishSubject.create().toSerialized();
安全来源
.subscribeOn()
.observeOn()
.subscribe(新订户(){
@凌驾
public void onNext(异步远程请求异步远程请求){
debug(“{}已调用。”,Thread.currentThread().getName());
doSomething();
}
});
请注意,subscribeOn
对PublishSubject
没有实际影响,因为它的subscribe()
方法中没有发生订阅副作用。您所体验到的是设计意图。如果从threadX调用onNext,则链中的下一个运算符将由同一线程调用。subscribeOn对您没有帮助,因为您无法从调用onNext的位置进行操作,您只能使用toSerialized来维护契约。我建议您使用onNext操作符输入一个“event”-实例,然后使用observeOn,在更改线程后,可以使用flatMap调用doSomething()。在subscribe回调中,您可以设置UI或对结果执行任何操作。您所体验到的是设计的意图。如果从threadX调用onNext,则链中的下一个运算符将由同一线程调用。subscribeOn对您没有帮助,因为您无法从调用onNext的位置进行操作,您只能使用toSerialized来维护契约。我建议您使用onNext操作符输入一个“event”-实例,然后使用observeOn,在更改线程后,可以使用flatMap调用doSomething()。在subscribe回调中,您可以设置您的UI或对结果执行任何操作。太棒了!非常感谢,只是忽略了这一关键方面。谢谢明亮的非常感谢,只是忽略了这一关键方面。谢谢