@Override public Observable<ReplicationHelloReply> hello(ReplicationHello hello) { operations.add(hello); return delegate.hello(hello); }
@Override public Observable<Void> call(ChangeNotification<InstanceInfo> notification) { switch (notification.getKind()) { case Add: return channel.register(notification.getData()); case Modify: return channel.register(notification.getData()); case Delete: return channel.unregister(notification.getData().getId()); default: logger.warn("Unrecognised notification kind {}", notification); return Observable.empty(); } } });
@Override public Observable<Void> register(final InstanceInfo instanceInfo) { return delegate.register(instanceInfo) .doOnCompleted(new Action0() { @Override public void call() { replicationItems.add(new ReplicationItem(instanceInfo.getId(), ReplicationItem.Type.Register)); } }) .doOnError(new Action1<Throwable>() { @Override public void call(Throwable throwable) { failedReplicationItems.add(new ReplicationItem(instanceInfo.getId(), ReplicationItem.Type.Register)); } }); }
@Override public Observable<Void> unregister(final String instanceId) { return delegate.unregister(instanceId) .doOnCompleted(new Action0() { @Override public void call() { replicationItems.add(new ReplicationItem(instanceId, ReplicationItem.Type.Unregister)); } }) .doOnError(new Action1<Throwable>() { @Override public void call(Throwable throwable) { failedReplicationItems.add(new ReplicationItem(instanceId, ReplicationItem.Type.Unregister)); } }); }
@Override public Observable<Void> call(final ReplicationChannel replicationChannel) { return replicationChannel.hello(new ReplicationHello(ownInstanceId, registry.size())) .take(1) .map(new Func1<ReplicationHelloReply, ReplicationChannel>() { @Override public ReplicationChannel call(ReplicationHelloReply replicationHelloReply) { if (replicationHelloReply.getSourceId().equals(ownInstanceId)) { logger.info("{}: Taking out replication connection to itself", ownInstanceId); replicationChannel.close(); // gracefully close return null; } else { logger.info("{} received hello back from {}", ownInstanceId, replicationHelloReply.getSourceId()); return replicationChannel; } } }) .filter(new Func1<ReplicationChannel, Boolean>() { @Override public Boolean call(ReplicationChannel channel) { return channel != null; } }) .concatMap(new ReplicateFunc(registry)); } });