在不同的线程rxJava上运行PublishSubject

时间:2016-10-25 14:13:10

标签: spring rx-java subject-observer

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

  • Schedulers.io()
  • Schedulers.computation()
  • my threads
  • Schedulers.newThread

onNext()及其中的实际工作是在实际调用主题onNext()的同一线程上完成的,以生成/生成数据。

这是对的吗?如果是这样,我错过了什么?我期待doSomething()可以在另一个线程上完成。

更新

在我的调用类中,如果我改变了调用publish方法的方式,那么当然会为订阅者分配一个新线程来运行。

taskExecutor.execute(() -> subjectObserver.publish(newlyGeneratedObj));

谢谢,

1 个答案:

答案 0 :(得分:5)

Observable / Subject上的每个操作符都会返回一个带有额外行为的新实例,但是,您的代码只会应用subscribeOnobserveOn,然后抛弃它们生成的任何内容并订阅原始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();
     }
});

请注意,subscribeOnPublishSubject没有实际影响,因为subscribe()方法中没有订阅副作用。