Rx java RxJava2,2个可观察/可流动的订户,但下一个订户被任何一个订户调用

Rx java RxJava2,2个可观察/可流动的订户,但下一个订户被任何一个订户调用,rx-java,rx-java2,watchservice,Rx Java,Rx Java2,Watchservice,rxjava2版本2.1.5 试图理解RxJava2对可观察对象的多个订阅。 有一个简单的文件监视服务,跟踪目录中文件的创建、修改和删除。 我添加了2个订阅服务器,并希望在两个订阅服务器上都打印事件。 当我将文件复制到监视的目录中时,我看到一个订阅者打印出事件。然后,当我删除文件时,我看到第二个订阅者打印出事件。 我希望两个订阅者都能打印事件。我错过了什么 import static java.nio.file.StandardWatchEventTypes.ENTRY\u CREATE; 导入

rxjava2版本2.1.5

试图理解RxJava2对可观察对象的多个订阅。 有一个简单的文件监视服务,跟踪目录中文件的创建、修改和删除。 我添加了2个订阅服务器,并希望在两个订阅服务器上都打印事件。 当我将文件复制到监视的目录中时,我看到一个订阅者打印出事件。然后,当我删除文件时,我看到第二个订阅者打印出事件。 我希望两个订阅者都能打印事件。我错过了什么

import static java.nio.file.StandardWatchEventTypes.ENTRY\u CREATE;
导入静态java.nio.file.StandardWatchEventTypes.ENTRY\u DELETE;
导入静态java.nio.file.StandardWatchEventTypes.ENTRY\u MODIFY;
导入java.io.IOException;
导入java.nio.file.FileSystem;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.nio.file.WatchEvent;
导入java.nio.file.WatchKey;
导入java.nio.file.WatchService;
导入java.util.concurrent.TimeUnit;
导入io.reactivex.backpressureStragy;
导入io.reactivex.Flowable;
导入io.reactivex.schedulers.schedulers;
公共类MyRxJava2DirWatcher{

public Flowable您正在为两个不同的订阅者创建两个不同的Flowable。让一个Flowable订阅两次,如下所示

publicstaticvoidmain(String[]args)抛出IOException、interruptedeexception{
Path Path=Path.get(“c:\\temp\\delete”);
final FileSystem FileSystem=path.getFileSystem();
WatchService watcher=fileSystem.newWatchService();
MyRxJava2DirWatcher my=新的MyRxJava2DirWatcher();
Flowable myFlowable=my.createFlowable(观察者,路径);
myFlowable.subscribeOn(Schedulers.computation()).subscribe(事件->{
System.out.println(“1>>事件种类:“+Event.kind()+”。受影响的文件:“+Event.context()+”
+Thread.currentThread().getName());
},onError->{
System.out.println(“1>>”+Thread.currentThread().getName());
onError.printStackTrace();
});
myFlowable.subscribeOn(Schedulers.computation()).subscribe(事件->{
System.out.println(“2>>事件种类:“+Event.kind()+”。受影响的文件:“+Event.context()+”
+Thread.currentThread().getName());
},onError->{
System.out.println(“2>>”+Thread.currentThread().getName());
onError.printStackTrace();
});
时间单位。分钟。睡眠(1000);
}
}

发生的情况是,您在两个
可流动的
之间共享相同的
WatchService
,它们在其中争夺事件。如果您改为传入
文件系统
,并在
Flowable.create
中调用
newWatchService()
,则您应接收所有事件的次数与订阅方的次数相同:


public flowablewatchservice#register方法是否提供了注册多个侦听器的功能,还是每次调用#register时侦听器都会被覆盖?如果是这样,那么很明显,第二个订阅覆盖了第一个#注册侦听器,并且第一个订阅不再得到通知。只需多播可观察的:@hans当我添加20个文件时,我得到40个通知,每个订户20个,每个订户10个create+10个modify事件。因此,第一个订阅者并不是被过度写入的。我还尝试创建一个新的flowable实例,但并没有任何改变。我将研究多播,因为这是我真正想要的,但我也需要了解当前的行为。这对我来说没有任何改变。结果与我的代码相同。只是输出的一小部分。。。。我不会为threadpool 1和thread Pool 2中的每个文件获取创建和修改事件1>>事件种类:ENTRY\u create。受影响的文件:1.txt。RxComputationThreadPool-1>>事件类型:条目\u修改。受影响的文件:1.txt。RxComputationThreadPool-1 2>>事件类型:条目\u创建。受影响的文件:2-复制(10).txt。RxComputationThreadPool-2 1>>事件类型:条目\u修改。受影响的文件:2-复制(10).txt。RxComputationThreadPool-1我将在稍后删除我的答案,因为@akarnokd现在是RxWorks的王者。谢谢。我不理解javadoc或推荐的错误标志。如果*链中存在{@link#create(FlowableOnSubscribe,BackPressureStragy)}类型的源,建议将{@code requestOn}设为false以避免相同的池死锁*因为请求可能堆积在急切/阻塞发射器后面,这是讨论的重点。
2>>Event kind:ENTRY_CREATE. File affected: 1.txt. RxCachedThreadScheduler-2
2>>Event kind:ENTRY_MODIFY. File affected: 1.txt. RxCachedThreadScheduler-2
1>>Event kind:ENTRY_DELETE. File affected: 1.txt. RxCachedThreadScheduler-1