@Override public void viewAccepted(View view) { ConsistentHash newHash = consistentHash.withExclusively(getMemberNames(view)); if (!consistentHash.equals(newHash)) { int messagesLost = 0; // check whether the members with outstanding callbacks are all alive for (Map.Entry<String, MemberAwareCommandCallback> entry : callbacks.entrySet()) { if (!entry.getValue().isMemberLive(view)) { MemberAwareCommandCallback callback = callbacks.remove(entry.getKey()); if (callback != null) { messagesLost++; callback.onFailure( new RemoteCommandHandlingException( "The connection with the destination was lost before the result was reported.")); } } } consistentHash = newHash; logger.info("Membership has changed. Rebuilt consistent hash ring."); logger.debug("New distributed hash: {}", consistentHash.toString()); if (messagesLost > 0 && logger.isWarnEnabled()) { logger.warn( "A member was disconnected while waiting for a reply. {} messages are lost without reply.", messagesLost); } } }
@SuppressWarnings("unchecked") private void processReplyMessage(ReplyMessage replyMessage) { MemberAwareCommandCallback callback = callbacks.remove(replyMessage.getCommandIdentifier()); if (callback != null) { if (replyMessage.isSuccess()) { callback.onSuccess(replyMessage.getReturnValue(serializer)); } else { callback.onFailure(replyMessage.getError(serializer)); } } }