public void launchKernelAgent() { log.info("Starting Kernel Agent"); String name = "KERNEL-AGENT"; KernelAgent agent = (KernelAgent) applicationContext.getBean("kernelAgent"); KernelAgentWorker kernelAgentWorker = (KernelAgentWorker) applicationContext.getBean("kernelAgentWorker"); agent.setNodeContext(Coordination.emptyContext(NodeId.kernelAgentNode(name))); agent.init(); log.info("Agent {} initialized", agent.getNodeContext().getId()); try { do { agent.stop(); agentLatch = new CountDownLatch(1); alive.set(false); do { try { RegistrationPack registrationPack = RegistrationPack.create( agent.getNodeContext().getId(), kernelAgentWorker.getQualifiers()); Ack ack = agent.getExchangeClient().registerNode(registrationPack); if (Ack.SUCCESS.equals(ack)) break; } catch (IOException e) { log.info("Agent {} can't do registration {}", agent.getNodeContext().getId(), e); log.info("Wait 10 seconds and try again"); Thread.sleep(AGENT_REGISTRATION_PERIOD); } } while (true); log.info("Registration agent {} has been done", agent.getNodeContext().getId()); agent.start(); agentLatch.await(); } while (alive.get()); } catch (InterruptedException e) { // do nothing; } agent.stop(); log.info("Kernel Agent finish work"); }