@Override public Observable<ReplicationHelloReply> hello(final ReplicationHello hello) { logger.debug("Replication hello message: {}", hello); if (!state.compareAndSet(STATES.Idle, STATES.Opened)) { return Observable.error(state.get() == STATES.Closed ? CHANNEL_CLOSED_EXCEPTION : HANDSHAKE_FINISHED_EXCEPTION); } metrics.stateTransition(STATES.Idle, STATES.Opened); replicationSource = Source.replicationSource(hello.getSourceId()); return selfRegistrationService.resolve().flatMap(new Func1<InstanceInfo, Observable<ReplicationHelloReply>>() { @Override public Observable<ReplicationHelloReply> call(InstanceInfo instanceInfo) { replicationLoop = instanceInfo.getId().equals(hello.getSourceId()); ReplicationHelloReply reply = new ReplicationHelloReply(instanceInfo.getId(), false); sendOnTransport(reply); return Observable.just(reply); } }); }
@Override public Observable<ReplicationHelloReply> hello(final ReplicationHello hello) { logger.debug("Replication hello message: {}", hello); if(!moveToState(STATE.Idle, STATE.Handshake)) { return Observable.error(state.get() == STATE.Closed ? CHANNEL_CLOSED_EXCEPTION : HANDSHAKE_FINISHED_EXCEPTION); } replicationSource = new Source(Source.Origin.REPLICATED, hello.getSourceId()); return selfIdentityService.resolve().take(1).flatMap(new Func1<InstanceInfo, Observable<ReplicationHelloReply>>() { @Override public Observable<ReplicationHelloReply> call(InstanceInfo instanceInfo) { replicationLoop = instanceInfo.getId().equals(hello.getSourceId()); ReplicationHelloReply reply = new ReplicationHelloReply(instanceInfo.getId(), false); sendOnTransport(reply); moveToState(STATE.Handshake, STATE.Connected); return Observable.just(reply); } }); }
@Override public Observable<ReplicationHelloReply> call(InstanceInfo instanceInfo) { replicationLoop = instanceInfo.getId().equals(hello.getSourceId()); ReplicationHelloReply reply = new ReplicationHelloReply(instanceInfo.getId(), false); sendOnTransport(reply); return Observable.just(reply); } });
@Override public Observable<ReplicationHelloReply> call(InstanceInfo instanceInfo) { replicationLoop = instanceInfo.getId().equals(hello.getSourceId()); ReplicationHelloReply reply = new ReplicationHelloReply(instanceInfo.getId(), false); sendOnTransport(reply); moveToState(STATE.Handshake, STATE.Connected); return Observable.just(reply); } });
protected void dispatchMessageFromClient(final Object message) { Observable<?> reply; if (message instanceof ReplicationHello) { logger.info("Received Hello from {}", ((ReplicationHello) message).getSourceId()); reply = hello((ReplicationHello) message); } else if (message instanceof RegisterCopy) { InstanceInfo instanceInfo = ((RegisterCopy) message).getInstanceInfo(); reply = register(instanceInfo);// No need to subscribe, the register() call does the subscription. } else if (message instanceof UnregisterCopy) { reply = unregister(((UnregisterCopy) message).getInstanceId());// No need to subscribe, the unregister() call does the subscription. } else { reply = Observable.error(new EurekaProtocolError("Unexpected message " + message)); } reply.ignoreElements().cast(Void.class).subscribe(new Subscriber<Void>() { @Override public void onCompleted() { // No-op } @Override public void onError(Throwable e) { sendErrorOnTransport(e); } @Override public void onNext(Void aVoid) { // No-op } }); }