/* * Copyright (c) 2011-2017 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.test.core; import io.vertx.core.AbstractVerticle; import io.vertx.core.CompositeFuture; import io.vertx.core.Future; import io.vertx.core.eventbus.Message; import io.vertx.core.eventbus.ReplyException; import io.vertx.core.eventbus.ReplyFailure; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; import java.util.ArrayList; import java.util.List; /** * @author Thomas Segismont */ public class FaultToleranceVerticle extends AbstractVerticle { private static final Logger log = LoggerFactory.getLogger(FaultToleranceVerticle.class); private int id; private int numAddresses; @Override public void start() throws Exception { JsonObject config = config(); id = config.getInteger("id"); numAddresses = config.getInteger("addressesCount"); List<Future> registrationFutures = new ArrayList<>(numAddresses); for (int i = 0; i < numAddresses; i++) { Future<Void> registrationFuture = Future.future(); registrationFutures.add(registrationFuture); vertx.eventBus().consumer(createAddress(id, i), msg -> msg.reply("pong")).completionHandler(registrationFuture.completer()); } Future<Void> registrationFuture = Future.future(); registrationFutures.add(registrationFuture); vertx.eventBus().consumer("ping", this::ping).completionHandler(registrationFuture.completer()); CompositeFuture.all(registrationFutures).setHandler(ar -> { if (ar.succeeded()) { vertx.eventBus().send("control", "start"); } }); } private void ping(Message<JsonArray> message) { JsonArray jsonArray = message.body(); for (int i = 0; i < jsonArray.size(); i++) { int node = jsonArray.getInteger(i); for (int j = 0; j < numAddresses; j++) { vertx.eventBus().send(createAddress(node, j), "ping", ar -> { if (ar.succeeded()) { vertx.eventBus().send("control", "pong"); } else { Throwable cause = ar.cause(); if (cause instanceof ReplyException) { ReplyException replyException = (ReplyException) cause; if (replyException.failureType() == ReplyFailure.NO_HANDLERS) { vertx.eventBus().send("control", "noHandlers"); return; } } log.error("Unexpected error during ping (id=" + id + ")", cause); } }); } } } private String createAddress(int id, int i) { return "address-" + id + "-" + i; } }