/** * From IMessagingClient */ @Override public ListenableFuture<RapidResponse> sendMessageBestEffort(final Endpoint remote, final RapidRequest msg) { return sendMessage(remote, msg); }
private ListenableFuture<RapidResponse> sendOnce(final Endpoint remote, final RapidRequest msg) { try { final long reqNo = counter.incrementAndGet(); final SettableFuture<RapidResponse> future = outstandingRequests.get(reqNo); final ChannelFuture f = channelCache.get(remote); ignoreFuture(f.channel().writeAndFlush(new WrappedRapidRequest(reqNo, msg), f.channel().voidPromise())); return future; } catch (final ExecutionException e) { return Futures.immediateFailedFuture(e); } }
/** * From IMessagingClient */ @Override public ListenableFuture<RapidResponse> sendMessage(final Endpoint remote, final RapidRequest msg) { return Futures.withTimeout(sendOnce(remote, msg), DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS, resources.getScheduledTasksExecutor()); }
@Override public void startCluster() throws IOException, InterruptedException { final Endpoint endpoint = Endpoint.newBuilder() .setHostname(listenAddress.getHost()) .setPort(listenAddress.getPort()).build(); // To use your own messaging implementation with Rapid, supply an instance each of IMessagingClient // and IMessagingServer to Cluster.Builder.setMessagingClientServer(). // // In this example, we use an object NettyClientServer which implements both the IMessagingClient // and IMessagingServer interfaces. final NettyClientServer nettyMessaging = new NettyClientServer(endpoint); if (listenAddress.equals(seedAddress)) { cluster = new Cluster.Builder(listenAddress) .setMessagingClientAndServer(nettyMessaging, nettyMessaging) .start(); } else { cluster = new Cluster.Builder(listenAddress) .setMessagingClientAndServer(nettyMessaging, nettyMessaging) .join(seedAddress); } cluster.registerSubscription(com.vrg.rapid.ClusterEvents.VIEW_CHANGE_PROPOSAL, this::onViewChangeProposal); cluster.registerSubscription(com.vrg.rapid.ClusterEvents.VIEW_CHANGE, this::onViewChange); cluster.registerSubscription(com.vrg.rapid.ClusterEvents.KICKED, this::onKicked); }