@Override public State<?, ?> handle( ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing) throws Throwable { switch (message.getMessageType()) { case configurationChanged: { ClusterMessage.ConfigurationChangeState state = message.getPayload(); if (state.isLeaving(context.getMe())) { context.timeouts.cancelTimeout("leave"); context.left(); return start; } else { state.apply(context); return leaving; } } case leaveTimedout: { context .getLogger(ClusterState.class) .warn( "Failed to leave. Cluster may consider this" + " instance still a " + "member"); context.left(); return start; } } return this; }
@Override public State<?, ?> handle( ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing) throws Throwable { switch (message.getMessageType()) { case configurationChanged: { ClusterMessage.ConfigurationChangeState state = message.getPayload(); if (context.getMe().equals(state.getJoin())) { context.timeouts.cancelTimeout("join"); context.joined(); outgoing.offer( message.copyHeadersTo( internal(ClusterMessage.joinResponse, context.getConfiguration()))); return entered; } else { state.apply(context); return this; } } case joiningTimeout: { context .getLogger(ClusterState.class) .info("Join timeout for " + message.getHeader(Message.CONVERSATION_ID)); // Go back to requesting configurations from potential members for (URI potentialClusterInstanceUri : context.getJoiningInstances()) { outgoing.offer(to(ClusterMessage.configurationRequest, potentialClusterInstanceUri)); } context.timeouts.setTimeout( "discovery", timeout( ClusterMessage.configurationTimeout, message, new ClusterMessage.ConfigurationTimeoutState(4))); return acquiringConfiguration; } case joinFailure: { // This causes an exception from the join() method return start; } } return this; }
@Override public State<?, ?> handle( ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing) throws Throwable { switch (message.getMessageType()) { case addClusterListener: { context.addClusterListener(message.<ClusterListener>getPayload()); break; } case removeClusterListener: { context.removeClusterListener(message.<ClusterListener>getPayload()); break; } case configurationRequest: { outgoing.offer( message.copyHeadersTo( respond( ClusterMessage.configurationResponse, message, new ClusterMessage.ConfigurationResponseState( context.getConfiguration().getRoles(), context.getConfiguration().getMembers(), new InstanceId(context.learnerContext.getLastDeliveredInstanceId()), context.getConfiguration().getName())))); break; } case configurationChanged: { ClusterMessage.ConfigurationChangeState state = message.getPayload(); state.apply(context); break; } case leave: { List<URI> nodeList = new ArrayList<URI>(context.getConfiguration().getMembers()); if (nodeList.size() == 1) { context .getLogger(ClusterState.class) .info("Shutting down cluster: " + context.getConfiguration().getName()); context.left(); return start; } else { context.getLogger(ClusterState.class).info("Leaving:" + nodeList); ClusterMessage.ConfigurationChangeState newState = new ClusterMessage.ConfigurationChangeState(); newState.leave(context.me); outgoing.offer(internal(AtomicBroadcastMessage.broadcast, newState)); context.timeouts.setTimeout("leave", timeout(ClusterMessage.leaveTimedout, message)); return leaving; } } } return this; }