Rx java RxJava从多个源接收数据包,并在每个数据包之间延迟写入OutputStream

Rx java RxJava从多个源接收数据包,并在每个数据包之间延迟写入OutputStream,rx-java,rx-java2,rx-java3,Rx Java,Rx Java2,Rx Java3,我让Java TCP客户端套接字读取InputStream,并通过RxJava PublishSubject将数据包分发到应用程序的各个部分。这很有效 有时我也会写OutputStream。命令转换为单个数据包(字节[]),并推送到流中。为此,我使用 public void writeToSocket(byte[] packet) { Completable.fromAction(() -> { outputStream.write(packet);

我让Java TCP客户端套接字读取InputStream,并通过RxJava PublishSubject将数据包分发到应用程序的各个部分。这很有效

有时我也会写OutputStream。命令转换为单个数据包(字节[]),并推送到流中。为此,我使用

public void writeToSocket(byte[] packet) {
    Completable.fromAction(() -> {
         outputStream.write(packet);
         outputStream.flush();
    }).subscribeOn(Schedulers.io()).subscribe(); 
}
现在我要执行

    outputStream.write(packet);
    outputStream.flush();
以符合以下条件的方式

  • 虽然源数据包是从多个地方(使用不同的命令)同时创建的,但对每个数据包执行上述命令时,延迟为50毫秒。理想情况下,将数据包排队并延迟执行

  • 是否有任何方法可以使用RxJava实现这一点。提前谢谢

    您可以使用序列化的
    PublishSubject
    收集字节,然后使用
    concatMapCompletable
    执行写入,然后进行延迟:

    var subject=PublishSubject.create().toSerialized();
    主题
    .concatMapCompletable(字节->
    Completable.fromAction(()->{
    outputStream.write(数据包);
    outputStream.flush();
    })
    .subscribeOn(Schedulers.io())
    .和(可完成计时器(50,时间单位毫秒))
    )
    .subscribe();
    
    或者,如果您不介意在任何时候都将一个线程用于发射,您可以只执行写入并在
    doOnNext
    中休眠:

    var subject=PublishSubject.create().toSerialized();
    主题
    .observeOn(Schedulers.io())
    .doOnNext(数据包->{
    outputStream.write(数据包);
    outputStream.flush();
    睡眠(50);
    })
    .subscribe();
    
    专用线程满足我的场景。非常感谢@akarnokd
    Example:
    Place1: createCommand1(), 
    Place2: createCommand1(), createCommand4()
    Place3: createCommand1(), createCommand2(), .... createCommand10()