Exemplo n.º 1
0
 private function startFetching(ConsumerContext $context, array $topics, $maxFetchSize, $offsetReset)
 {
     $context->close();
     $streams = array();
     foreach ($topics as $topic) {
         $partitions = $this->getOwnedPartitions($topic);
         $offsets = $this->metadata->getTopicOffsets($this->groupId, $topic);
         foreach ($partitions as $vpId => $virtualPartition) {
             $partition = $virtualPartition['partition'];
             $broker = $this->getKafkaByBrokerId($virtualPartition['broker']);
             $consumer = $broker->createConsumer();
             if (!isset($offsets[$virtualPartition['id']])) {
                 $offset = $offsetReset;
             } else {
                 $offset = $offsets[$virtualPartition['id']];
                 $ofsr = $consumer->offsets($topic, $partition, \Kafka\Kafka::OFFSETS_EARLIEST);
                 if ($offset < array_shift($ofsr)) {
                     $offset = $offsetReset;
                 } else {
                     $ofsr = $consumer->offsets($topic, $partition, \Kafka\Kafka::OFFSETS_LATEST);
                     if ($offset > array_shift($ofsr)) {
                         $offset = $offsetReset;
                     }
                 }
             }
             $stream = new MessageStream($this->metadata, $this->groupId, $consumer, $topic, $virtualPartition['broker'], $partition, $maxFetchSize, $offset);
             $streams[] = $stream;
         }
     }
     $context->assignStreams($streams);
 }