conf = new Conf(); $this->topicConf = new TopicConf(); parent::__construct($config); } /** * @param $servers * @return Producer */ public function setBrokers(string $servers) { $this->conf->set('metadata.broker.list', $servers); return $this; } /** * @param bool $value * @return $this */ public function setAck(bool $value) { $this->topicConf->set('request.required.acks', (int)$value); return $this; } /** * @param $servers * @return Producer */ public function setTopic(string $servers) { $this->_topic = $servers; return $this; } /** * @param $message * @param null $key * @param int $timeout * @throws */ public function delivery($message, $key = null, $timeout = 5) { if (!$this->conf || !$this->topicConf) { throw new \Exception('Error. Please set kafka conf.'); } $this->conf->setDrmSgCb(function ($kafka, $message) { // $this->debug(var_export($message, true)); }); $this->conf->setErrorCb(function ($kafka, $err, $reason) { $this->error(sprintf("Kafka error: %s (reason: %s)", rd_kafka_err2str($err), $reason)); }); $rk = Snowflake::createObject(\RdKafka\Producer::class, [$this->conf]); $topic = $rk->newTopic($this->_topic, $this->topicConf); $topic->produce(RD_KAFKA_PARTITION_UA, 0, $message, $key); $rk->poll($timeout); $rk->flush($timeout); $event = Snowflake::app()->getEvent(); $event->on(Event::EVENT_AFTER_REQUEST, function ($rk, $timeout) { var_dump(func_get_args()); }, [$rk, $timeout]); } /** * @throws NotFindClassException * @throws ReflectionException */ public function onFlush() { /** @var \RdKafka\Producer $rk */ $rk = Snowflake::getDi()->get(\RdKafka\Producer::class); $this->debug(Event::EVENT_AFTER_REQUEST); $rk->flush(10); } }