Spring 在不同的线程rxJava上运行PublishSubject

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

我正在运行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);
    }
}

谢谢,

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或对结果执行任何操作。太棒了!非常感谢,只是忽略了这一关键方面。谢谢明亮的非常感谢,只是忽略了这一关键方面。谢谢