Rx java RxJava阻止等待交互但避免争用条件的线程

Rx java RxJava阻止等待交互但避免争用条件的线程,rx-java,observable,Rx Java,Observable,我完全是RxJava的初学者,如果这是显而易见的,我深表歉意 我想进行一个服务器调用,同步返回一个id。我有一个独立的异步事件机制,用于将通知接收回我映射到rxjava流的客户端应用程序。我期待“稍后”收到带有上述id的通知 正常情况下,我当然会异步使用这些通知,但我还想证明我可以阻止,等待相关通知(在前面提到的id上过滤) myObservables是可观察的 客户端应用程序调用远程服务器,获取id 现在我想阻止,直到我收到与我的id相关的通知 通知notn=。。。myObservables(

我完全是RxJava的初学者,如果这是显而易见的,我深表歉意

我想进行一个服务器调用,同步返回一个
id
。我有一个独立的异步事件机制,用于将通知接收回我映射到rxjava流的客户端应用程序。我期待“稍后”收到带有上述
id
的通知

正常情况下,我当然会异步使用这些通知,但我还想证明我可以阻止,等待相关通知(在前面提到的
id
上过滤)

  • myObservables是
    可观察的
  • 客户端应用程序调用远程服务器,获取
    id
  • 现在我想阻止,直到我收到与我的id相关的通知
    通知notn=。。。myObservables(notn->notn.getId().equals(id)).toBlocking()…
  • 我认为这必须有一个简单的模式,例如,在步骤#1中,从该点开始排队通知,以避免在#3中的竞争条件,在我们开始等待通知之前,通知已经到达

    编辑:我认为以下方法似乎有效。这是明智的还是有更好的方法

    // This is NOT a idiomatic pattern, only used to demo how you would blocking for
    // the Notification
    
    // Avoid race cond by storing up the notifications
    ReplaySubject<Notification> mySubject = ReplaySubject.create();
    myNotnObservables.subscribe(mySubject);
    
    final Long id = // obtain id via a synchronous request to server.
    
    return mySubject.timeout(10, TimeUnit.SECONDS).
    filter(notn -> notn.getId().equals(id)).
    toBlocking().first();  
    
    //这不是一个惯用模式,仅用于演示如何为
    //通知
    //通过存储通知来避免竞争条件
    ReplaySubject mySubject=ReplaySubject.create();
    订阅(mySubject);
    final Long id=//通过对服务器的同步请求获取id。
    返回mySubject.timeout(10,TimeUnit.SECONDS)。
    过滤器(notn->notn.getId().equals(id))。
    toBlocking().first();
    
    让我检查一下我是否理解正确:您有两个事件,即id调用的结果和通知,并且您只想在两个事件都已发生时才执行操作。抱歉,否;我更新了这个问题,以澄清检索回id的原始请求是一种传统的阻塞调用(不使用rxjava)。