У меня есть кластер Akka, который требует 3 узла:
cluster {
seed-nodes = [
"akka.tcp://ClusterSystem@127.0.0.1:2551"
,"akka.tcp://ClusterSystem@127.0.0.1:2552"]
min-nr-of-members = 3
}
А затем я использую Cluster Singleton для запуска актера, который запускает маршрутизатор с поддержкой кластера:
deployment {
/parent/singleton/router1 {
router = round-robin-pool
nr-of-instances = 3
cluster {
enabled = on
max-nr-of-instances-per-node = 1
allow-local-routees = on
}
}
Вот как я инициализирую синглтон:
@Override
public void preStart()
{
ActorRef router =
getContext().actorOf(
WorkerActor.props().withRouter(FromConfig.getInstance()),
"router1");
Runnable r = () -> {
for (int i = 0; i < 20; i++) {
WorkerActor.Message message = WorkerActor.Message.addAccount(
WorkerActor.Account.of("username_" + i,
"password_" + i)
);
router.tell(message, ActorRef.noSender());
}
};
getContext().getSystem().scheduler()
.scheduleOnce(Duration.ZERO, r,
getContext().dispatcher());
}
Когда я запускаю 3 узла кластера, синглтон создается и начинает посылать сообщения на его маршруты, но кажется, что на данный момент существует только один, поэтому все сообщения идут на этот. Я хочу дождаться, пока будут готовы 3 маршрута, и затем перебрать сообщения малиновки между ними.
Единственный способ, которым я смог достичь этого, - это добавить задержку к scheduleOnce
, как это
getContext().getSystem().scheduler()
.scheduleOnce(Duration.ofSeconds(5) , r,
getContext().dispatcher());
Но это все равно что скрестить пальцы, что 3 экземпляра будут готовы, прежде чем вы начнете отправлять сообщения.
Итак, вопрос в том, как правильно ожидать готовности всех nr-of-instances
требуемых экземпляров Routee, прежде чем начать отправлять им сообщения?