Rx java 流中项目的rxjava筛选器与流中的任何其他筛选器都不匹配

Rx java 流中项目的rxjava筛选器与流中的任何其他筛选器都不匹配,rx-java,Rx Java,我的应用程序中的CommandManager通过网络协议接收命令,并将其发布到commands PublishSubject上。特定的CommandHandler类订阅commands PublishSubject,以便每个CommandHandler只接收其设计用于处理的命令。我还希望有一个默认的命令处理程序,它只接收没有其他CommandHandler的筛选器谓词匹配的thos命令 // Each CommandHandler subscribes to a filtered // str

我的应用程序中的CommandManager通过网络协议接收命令,并将其发布到commands PublishSubject上。特定的CommandHandler类订阅commands PublishSubject,以便每个CommandHandler只接收其设计用于处理的命令。我还希望有一个默认的命令处理程序,它只接收没有其他CommandHandler的筛选器谓词匹配的thos命令

// Each CommandHandler subscribes to a filtered 
// stream of incoming commands matching this CommanHandler

commandManager.getCommandsPublishSubject()
.filter(getMessageFilterPredicate())
.subscribe(this::onNewMessage, 
     e -> LOGGER.error("Error getting new message", e));

是否有方法应用筛选器来匹配任何CommandHandler都不匹配的项?

没有标准的运算符来执行此操作。您必须创建一个自定义组件,而不是操作符,该组件承载过滤器lambda以及每个案例和默认主题的更多主题

公共最终类过滤器Dispatcher{
静态最终类FilterAndSubject{
谓词;
学科;
}
最终ConcurrentMap过滤器=新ConcurrentHashMap();
最终主题defaultSubject=PublishSubject.create().toSerialized();
公共可观察寄存器预测(字符串名称、谓词){
Subject-Subject=PublishSubject.create().toSerialized();
FilterAndSubject fs=新的FilterAndSubject();
谓词=谓词;
fs.subject=主语;
FilterAndSubject old=filters.putIfAbsent(名称,fs);
返回旧的!=null?旧的。主题:主题;
}
公共可观察getObservable(字符串名称){
返回filters.get(name).subject;
}
公共可观测getDefaultObservable(){
返回默认主题;
}
下一页(T项)的公共空白{
对于(FilterAndSubject fs:filters.values()){
if(fs.谓词.测试(项目)){
财政司司长:主题:onNext(项目);;
返回;
}
}
defaultSubject.onNext(项目);
}
}