@Deactivate
  public void deactivate() {
    executor.shutdownNow();

    eventDispatcher.removeSink(WorkPartitionEvent.class);
    leadershipService.removeListener(leaderListener);
    log.info("Stopped");
  }
  @Activate
  public void activate() {
    localNodeId = clusterService.getLocalNode().id();
    leadershipService.addListener(leaderListener);

    listenerRegistry = new ListenerRegistry<>();
    eventDispatcher.addSink(WorkPartitionEvent.class, listenerRegistry);

    for (int i = 0; i < NUM_PARTITIONS; i++) {
      leadershipService.runForLeadership(getPartitionPath(i));
      log.debug("Registered to run for {}", getPartitionPath(i));
    }

    executor.scheduleAtFixedRate(
        () -> scheduleRebalance(0), 0, CHECK_PARTITION_BALANCE_PERIOD_SEC, TimeUnit.SECONDS);
    log.info("Started");
  }