Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 卡夫卡';s ZookePerConsumerConnector.createMessageStreams永远不会返回_Clojure_Apache Kafka_Clj Kafka - Fatal编程技术网

Clojure 卡夫卡';s ZookePerConsumerConnector.createMessageStreams永远不会返回

Clojure 卡夫卡';s ZookePerConsumerConnector.createMessageStreams永远不会返回,clojure,apache-kafka,clj-kafka,Clojure,Apache Kafka,Clj Kafka,我正在尝试从我的Kafka 0.8.1集群检索数据。我已经创建了一个ZookeeperConsumerConnector的实例,然后尝试对其调用createMessageStreams。然而,无论我做什么,它似乎只是挂起并且永远不会返回,即使这是我对卡夫卡所做的唯一一件事 阅读邮件列表似乎有时会发生这种情况有几个原因,但据我所知,我还没有做过这些事情 此外,我将指出,我实际上是在Clojure中使用clj kafka来执行此操作,但我怀疑clj kafka不是问题所在,因为即使我运行以下代码,我

我正在尝试从我的Kafka 0.8.1集群检索数据。我已经创建了一个
ZookeeperConsumerConnector
的实例,然后尝试对其调用
createMessageStreams
。然而,无论我做什么,它似乎只是挂起并且永远不会返回,即使这是我对卡夫卡所做的唯一一件事

阅读邮件列表似乎有时会发生这种情况有几个原因,但据我所知,我还没有做过这些事情

此外,我将指出,我实际上是在Clojure中使用clj kafka来执行此操作,但我怀疑clj kafka不是问题所在,因为即使我运行以下代码,我也会遇到问题:

(.createMessageStreams
  (clj-kafka.consumer.zk/consumer {"zookeeper.connect" "127.0.0.1:2181"
                                   "group.id" "my.consumer"
                                   "auto.offset.reset" "smallest"
                                   "auto.commit.enable" "false"})
  {"mytopic" (int 1)})
只需使用
Consumer.createJavaConsumerConnector
创建
ZookeeperConsumerConnector
,而无需做任何花哨的事情

此外,“mytopic”中肯定有消息,因为我可以从命令行运行以下命令并返回我已发送到主题的所有内容:

% kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --topic mytopic --from-beginning
所以这也不是说这个话题是空的

在这一点上感到难堪。想法

ETA:我想我真正的意思是,它似乎在旋转一根线,然后陷在里面,什么也不做。如果我从REPL运行此代码,我可以通过点击control-c摆脱它,然后我得到以下错误:

IllegalMonitorStateException   java.util.concurrent.locks.ReentrantLock$Sync.tryRelease (ReentrantLock.java:155)

在中断REPL时,我遇到了相同的问题和相同的异常。它挂起的原因是由于consumer.zk命名空间中的lazy iterate函数。从中读取消息的队列是LinkedBlockingQueue,在惰性迭代函数调用中调用.hasNext。使用此队列。这将在队列上创建一个读锁,并将阻塞并等待,直到有什么东西可以离开队列。这意味着惰性迭代函数将永远不会实际返回。“messages”函数调用lazy iterate,如果您不执行类似的操作

(take 2 (messages "mytopic" some-consumer))
然后消息函数将永远不会返回并无限期挂起。我认为这是clj卡夫卡的一个缺陷(或设计缺陷)。为了说明确实发生了这种情况,请尝试在使用者配置中设置“consumer.timeout.ms”“0”。它将抛出TimeoutExpection并将控件返回给REPL


这进一步导致“with resource”宏出现问题。宏将绑定到使用者、关闭函数和主体;它调用主体,然后调用关闭fn。如果在主体内部调用“messages”,主体将永远不会返回,因此将永远不会调用shutdown函数。如果调用了shutdown,messages函数将返回,因为shutdown会在队列上放置一条消息,通知使用者清理其资源和线程以准备GC。该宏将应用程序置于这样一种状态:退出主循环的唯一方法是终止应用程序(或调用它的线程)本身。在为生产环境做好准备之前,该库肯定还有一段路要走。

我仍然没有解决这个问题,但我已经暂时切换到RabbitMQ,我似乎已经在使用它,并且应该让我保持一段时间。尽管如此,解决方案仍然在寻求中,因为我最终需要处理比RabbitMQ所能支持的更多的卷。如果使用一些随机的新group.id而不是“my.consumer”,会发生什么?“my.consumer”的补偿可能已经提交给ZK。@sandris我不记得我是否专门尝试过,但我相当肯定,即使是第一次使用新的ZK和Kafka,我也看到了这个问题,所以我作为group.id提供的任何东西都应该是新的。