@Override public <R> Map<Node, CompletionStage<R>> executeOnGroup(Command<R, ? super C> command, Node... excludedMembers) throws CommandDispatcherException { Set<Node> excluded = (excludedMembers != null) ? new HashSet<>(Arrays.asList(excludedMembers)) : Collections.emptySet(); Map<Node, CompletionStage<R>> results = new ConcurrentHashMap<>(); Buffer buffer = this.createBuffer(command); for (Node member : this.group.getMembership().getMembers()) { if (!excluded.contains(member)) { Address address = this.group.getAddress(member); if (this.localAddress.equals(address)) { results.put(member, this.localDispatcher.executeOnMember(command, member)); } else { try { ServiceRequest<R> request = new ServiceRequest<>(this.dispatcher.getCorrelator(), this.group.getAddress(member), this.options); CompletionStage<R> future = request.send(buffer); results.put(member, future); future.whenComplete(new PruneCancellationTask<>(results, member)); } catch (CommandDispatcherException e) { // Cancel previously dispatched messages for (CompletionStage<R> result : results.values()) { result.toCompletableFuture().cancel(true); } throw e; } } } } return results; }
@Override public <R> CompletionStage<R> executeOnMember(Command<R, ? super C> command, Node member) throws CommandDispatcherException { // Bypass MessageDispatcher if target node is local Address address = this.group.getAddress(member); if (this.localAddress.equals(address)) { return this.localDispatcher.executeOnMember(command, member); } Buffer buffer = this.createBuffer(command); ServiceRequest<R> request = new ServiceRequest<>(this.dispatcher.getCorrelator(), this.group.getAddress(member), this.options); return request.send(buffer); }
@Override public <R> Map<Node, CompletionStage<R>> executeOnGroup(Command<R, ? super C> command, Node... excludedMembers) throws CommandDispatcherException { Set<Node> excluded = (excludedMembers != null) ? new HashSet<>(Arrays.asList(excludedMembers)) : Collections.emptySet(); Map<Node, CompletionStage<R>> results = new ConcurrentHashMap<>(); Buffer buffer = this.createBuffer(command); for (Node member : this.group.getMembership().getMembers()) { if (!excluded.contains(member)) { Address address = this.group.getAddress(member); if (this.localAddress.equals(address)) { results.put(member, this.localDispatcher.executeOnMember(command, member)); } else { try { ServiceRequest<R> request = new ServiceRequest<>(this.dispatcher.getCorrelator(), this.group.getAddress(member), this.options); CompletionStage<R> future = request.send(buffer); results.put(member, future); future.whenComplete(new PruneCancellationTask<>(results, member)); } catch (CommandDispatcherException e) { // Cancel previously dispatched messages for (CompletionStage<R> result : results.values()) { result.toCompletableFuture().cancel(true); } throw e; } } } } return results; }
@Override public <R> CompletionStage<R> executeOnMember(Command<R, ? super C> command, Node member) throws CommandDispatcherException { // Bypass MessageDispatcher if target node is local Address address = this.group.getAddress(member); if (this.localAddress.equals(address)) { return this.localDispatcher.executeOnMember(command, member); } Buffer buffer = this.createBuffer(command); ServiceRequest<R> request = new ServiceRequest<>(this.dispatcher.getCorrelator(), this.group.getAddress(member), this.options); return request.send(buffer); }