java - 为什么在zookeeper WorkerSender中使用poll()而不是take()

标签 java apache-zookeeper

我一直在阅读zookeeper源代码,发现当从FastLeaderElection.WorkerSender中的队列中获取ToSend消息时,他们使用poll() 而不是 take()。为什么?

poll() 更好吗?

搜索 git 历史记录,我发现它开始使用 take(),所以改为 poll() 肯定是有原因的。

public void run() {
  while (!stop) {
    try {
      ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS);
      if (m == null) {
        continue;
      }
      process(m);
    } catch (InterruptedException e) {
      break;
    }
  }
  LOG.info("WorkerSender is down");
}

最佳答案

TL;DR:检查停止标志。

<小时/>

ZOOKEEPER-498进行了更改:FastLeaderElection.java的差异

旧代码:

class WorkerReceiver implements Runnable {

    QuorumCnxManager manager;

    WorkerReceiver(QuorumCnxManager manager) {
        this.manager = manager;
    }

    public void run() {

        Message response;
        while (true) {
            // Sleeps on receive
            try{
                response = manager.recvQueue.take();

                // Receive new message
                LOG.debug("Receive new message.");

新代码:

class WorkerReceiver implements Runnable {
    volatile boolean stop;
    QuorumCnxManager manager;

    WorkerReceiver(QuorumCnxManager manager) {
        this.stop = false;
        this.manager = manager;
    }

    public void run() {

        Message response;
        while (!stop) {
            // Sleeps on receive
            try{
                response = manager.recvQueue.poll(3000, TimeUnit.MILLISECONDS);
                if(response == null) continue;

                // Receive new message
                LOG.debug("Receive new message.");

they use poll() instead of take(). Why ?

这样他们就可以每 3 秒检查一次新的 stop 标志

关于java - 为什么在zookeeper WorkerSender中使用poll()而不是take(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705093/

相关文章:

java - 为什么我的 Android 应用程序找不到 XML 文件中声明的 TextView 或按钮?

Java 随机类不是真正随机的吗?

java - Android Manifest 文件定制

apache-kafka - Kafka缓存的zkVersion不等于zookeeper代理中的zkVersion未恢复

java - 用于分配分片索引的 Zookeeper

java.security.AccessControlException : File accessible thru browser but not within same server

java - Hadoop IntWritable可迭代通过索引检索值?

apache-kafka - Kafka Broker - 它和 Zookeeper 一样吗?或者 KafkaProducer 是经纪人?

python - 我可以递归地在 Zookeeper 中创建路径吗?

hadoop - hadoop 中的 zookeeper、日志节点任务和仲裁日志管理器有什么区别?