diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterView.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterView.java index c276b152d26ae..daf3581139322 100644 --- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterView.java +++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterView.java @@ -47,6 +47,7 @@ final class ZooKeeperClusterView extends AbstractCamelClusterView { private final CuratorFramework client; private final CuratorLocalMember localMember; private volatile LeaderSelector leaderSelector; + private volatile boolean leader; public ZooKeeperClusterView(CamelClusterService cluster, ZooKeeperCuratorConfiguration configuration, CuratorFramework client, String namespace) { @@ -110,6 +111,7 @@ protected void doStart() throws Exception { if (leaderSelector == null) { leaderSelector = new LeaderSelector(client, getFullPath(), new CamelLeaderElectionListener()); leaderSelector.setId(getClusterService().getId()); + leaderSelector.autoRequeue(); leaderSelector.start(); } else { leaderSelector.requeue(); @@ -119,8 +121,9 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { if (leaderSelector != null) { + leader = false; leaderSelector.interruptLeadership(); - fireLeadershipChangedEvent(getLeader().orElse(null)); + fireLeadershipChangedEvent((CamelClusterMember) null); } } @@ -142,6 +145,7 @@ private String getFullPath() { private final class CamelLeaderElectionListener extends LeaderSelectorListenerAdapter { @Override public void takeLeadership(CuratorFramework curatorFramework) throws Exception { + leader = true; fireLeadershipChangedEvent(localMember); BlockingTask task = Tasks.foregroundTask().withBudget(Budgets.iterationBudget() @@ -149,8 +153,12 @@ public void takeLeadership(CuratorFramework curatorFramework) throws Exception { .withInterval(Duration.ofSeconds(5)) .build()) .build(); - - task.run(getCamelContext(), () -> !isRunAllowed()); + try { + task.run(getCamelContext(), () -> !isRunAllowed() || !leaderSelector.hasLeadership()); + } finally { + leader = false; + fireLeadershipChangedEvent((CamelClusterMember) null); + } fireLeadershipChangedEvent(getLeader().orElse(null)); } @@ -159,7 +167,7 @@ public void takeLeadership(CuratorFramework curatorFramework) throws Exception { private final class CuratorLocalMember implements CamelClusterMember { @Override public boolean isLeader() { - return leaderSelector != null && leaderSelector.hasLeadership(); + return leader; } @Override