馆长领导选举错误,而连接字符串不是新的 TestingServer().getConnectString

Curator leader election error while connection string not the new TestingServer().getConnectString

将示例代码复制到本地,将zk连接字符串从new TestingServer().getConnectString更改为"host:port",得到错误:

ERROR org.apache.curator.framework.recipes.leader.LeaderLatch getChildren() failed. rc = -6 [main-EventThread]

代码:

import org.apache.curator.framework.CuratorFramework
import org.apache.curator.framework.CuratorFrameworkFactory
import org.apache.curator.framework.recipes.leader.{LeaderLatch,LeaderLatchListener}
import org.apache.curator.retry.ExponentialBackoffRetry
import org.apache.curator.utils.CloseableUtils
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util

object Main {
  private val PATH = "/lead"

  def main(args: Array[String]): Unit = {
    val clients = new util.ArrayList[CuratorFramework]
    val lists = new util.ArrayList[LeaderLatch]()

    try {
      for (i <- 0 to 2) {
        val client = CuratorFrameworkFactory.newClient("xxxxx.org:2181", new ExponentialBackoffRetry(10000, 1))
        //val client =  CuratorFrameworkFactory.newClient(new TestingServer().getConnectString, new ExponentialBackoffRetry(10000, 1))

        clients.add(client)
        client.start()
        client.blockUntilConnected()

        val example = new LeaderLatch(client, PATH, i.toString)
        lists.add(example)

        example.start()

        example.addListener(new LeaderLatchListener {
            override def isLeader(): Unit = {
            println(s"I am the lead $i")
          }

          override def notLeader(): Unit = {
            println(s"i am not the leader any more $i")
          }
        })
      }

      Thread.sleep(5000)
      println("Press enter/return to quit\n")
      new BufferedReader(new InputStreamReader(System.in)).readLine
    }
    finally {
      System.out.println("Shutting down...")
      import scala.collection.JavaConversions._
      for(example <- lists)
        CloseableUtils.closeQuietly(example)
      for (client <- clients) {
        CloseableUtils.closeQuietly(client)
      }
    }
  }
}

图书馆:

libraryDependencies += "org.apache.curator" % "apache-curator" % "4.0.0"
libraryDependencies += "org.apache.curator" % "curator-framework" % "4.0.0"
libraryDependencies += "org.apache.curator" % "curator-recipes" % "4.0.0"
libraryDependencies += "org.apache.curator" % "curator-test" % "4.0.0"
libraryDependencies += "org.apache.curator" % "curator-x-discovery" % "4.0.0"
libraryDependencies += "org.apache.curator" % "curator-x-async" % "4.0.0"

想通了,理论上没有任何问题,但确实有效。

  • 将策展人库更改为 3.3.0
  • 在zookeeper中手动创建/lead节点

动物园管理员版本:3.4.10

所以看起来像是 版本兼容性 问题。

您需要从 curator 依赖项中排除 zookeeper exclude("org.apache.zookeeper","zookeeper"),

然后添加正确的zookeeper依赖"org.apache.zookeeper" % "zookeeper" % "3.4.9"

我的 zookeeper 服务器是 3.4.9

zookeeper 和 curator 版本兼容性。编辑maven依赖,如:

<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>4.0.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
</dependency>