Rxjs 如何在同一个单一/可观察对象的多个实例中仅强制1个订阅者?

Rxjs 如何在同一个单一/可观察对象的多个实例中仅强制1个订阅者?,rxjs,rx-java,reactive-programming,rx-java2,Rxjs,Rx Java,Reactive Programming,Rx Java2,我将此同步建模为单个同步,一次只能运行一个同步。 我正在尝试订阅一个调度程序.single()上的“作业”,它主要起作用,但在链中有调度程序跳(到db writes调度程序),这会取消阻止由single()创建的自然队列。 然后我查看了flatMap(maxConcurrency=1),但这不起作用,因为这需要始终使用相同的实例。也就是说,据我所知,某种类型的同步请求是不可编译的,因为我的用例主要是这样的 fun someAction1AndSync(): Single<Unit>

我将此同步建模为单个同步,一次只能运行一个同步。

我正在尝试订阅一个
调度程序.single()
上的“作业”,它主要起作用,但在链中有调度程序跳(到db writes调度程序),这会取消阻止由
single()创建的自然队列。

然后我查看了
flatMap(maxConcurrency=1)
,但这不起作用,因为这需要始终使用相同的实例。也就是说,据我所知,某种类型的同步请求是不可编译的,因为我的用例主要是这样的

fun someAction1AndSync(): Single<Unit> {
   return someAction1()
     .flatMap { sync() }
}

fun someAction2AndSync(): Single<Unit> {
   return someAction2()
     .flatMap { sync() }
}

...
fun someaction1和sync():单身{
返回someAction1()
.flatMap{sync()}
}
有趣的someAction2和sync():单身{
返回someAction2()
.flatMap{sync()}
}
...
如您所见,其单独的同步单个实例:/

另请注意,在同步完成之前,someActionXAndSync不应发出


基本上,我在寻找协同程序
信号量

我可以想出三种方法:

  • 使用单个线程执行整个同步操作(通过队列解耦)
  • 使用信号量来保护sync方法不被多次输入(不推荐,因为这会阻止被调用方)
  • 进行同步时快速返回(AtomicBoolean)
可能有其他的解决办法,我不知道

在同步进行时快速返回 另请注意,在同步完成之前,someActionXAndSync不应发出

此解决方案不会将同步请求排队,但会很快失败。被调用方必须正确处理错误

同步服务 处理 当同步过程已经发生时,您将收到onError。必须以某种方式处理此问题,因为OneError将被发送到订阅服务器。要么你对它很满意,要么你可以完全忽略它

    fun someAction1AndSync(): Completable {
        return Single.just("")
            .flatMapCompletable {
                sync().onErrorComplete()
            }
    }
使用单个线程执行整个同步操作 您必须确保在单个作业中处理整个同步过程。当同步进程由其他线程上的多个反应步骤组成时,可能会发生另一个同步进程启动,而一个同步进程已经在进行中

怎么用? 您必须有一个带有一个线程的调度程序。每个同步调用都必须从给定的计划程序中调用。同步操作必须在一个正在运行的作业中完成同步。

我将使用以下方法:

fun Observable<Unit>.forceOnlyOneSubscriber(): Observable<Unit> {
    val subscriberCount = AtomicInteger(0)
    return doOnSubscribe { subscriberCount.incrementAndGet() }
        .doFinally { subscriberCount.decrementAndGet() }
        .doOnSubscribe { check(subscriberCount.get() <= 1) }
}
fun Observable.forceOnlyOneSubscriber():Observable{
val subscriberCount=AtomicInteger(0)
返回doOnSubscribe{subscriberCount.incrementAndGet()}
.doFinally{subscriberCount.decrementAndGet()}

.doOnSubscribe{check(subscriberCount.get())关于单线程。我已经尝试过了,但是如果sync中有线程跳跃,那么它就会出错。现在就足够了,但是将来可能有人在那里添加一个observeOn,它会意外失败。我觉得在布尔值上显式线程阻塞可能会更好,尽管我知道这并不酷。基本上我想要flatMap maxConcurrency=1 b具有共享状态的ut是否检查
如果为false则抛出?
fun Observable<Unit>.forceOnlyOneSubscriber(): Observable<Unit> {
    val subscriberCount = AtomicInteger(0)
    return doOnSubscribe { subscriberCount.incrementAndGet() }
        .doFinally { subscriberCount.decrementAndGet() }
        .doOnSubscribe { check(subscriberCount.get() <= 1) }
}