This commit is contained in:
2020-10-10 13:55:14 +08:00
parent 4bb06ef42d
commit 1e5acbb2f1
2 changed files with 44 additions and 27 deletions
+2
View File
@@ -60,6 +60,8 @@ class Consumer
* start consumer * start consumer
* *
* @access public * @access public
* @param \Closure|null $consumer
* @param bool $isBlock
* @return void * @return void
*/ */
public function start(\Closure $consumer = null, $isBlock = true) public function start(\Closure $consumer = null, $isBlock = true)
+24 -9
View File
@@ -6,10 +6,12 @@ namespace Kafka;
use Snowflake\Exception\ConfigException; use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake; use Snowflake\Snowflake;
use Swoole\Coroutine;
use Swoole\Coroutine\Channel; use Swoole\Coroutine\Channel;
use Swoole\Coroutine\WaitGroup; use Swoole\Coroutine\WaitGroup;
use Swoole\Process; use Swoole\Process;
use Snowflake\Abstracts\Config as SConfig; use Snowflake\Abstracts\Config as SConfig;
use function Amp\stop;
/** /**
* Class Queue * Class Queue
@@ -28,7 +30,7 @@ class Kafka extends \Snowflake\Process\Process
public function initConfig() public function initConfig()
{ {
$kafka = SConfig::get('kafka'); $kafka = SConfig::get('kafka');
$config = \Kafka\ConsumerConfig::getInstance(); $config = ConsumerConfig::getInstance();
$config->setMetadataRefreshIntervalMs( $config->setMetadataRefreshIntervalMs(
$kafka['metadataRefreshIntervalMs'] ?? 1000 $kafka['metadataRefreshIntervalMs'] ?? 1000
); );
@@ -36,9 +38,6 @@ class Kafka extends \Snowflake\Process\Process
$config->setGroupId($kafka['groupId']); $config->setGroupId($kafka['groupId']);
$config->setBrokerVersion($kafka['version']); $config->setBrokerVersion($kafka['version']);
$config->setTopics($kafka['topics']); $config->setTopics($kafka['topics']);
$this->channel = new Channel(1000);
go([$this, 'listener']);
} }
@@ -49,8 +48,9 @@ class Kafka extends \Snowflake\Process\Process
public function onHandler(Process $process) public function onHandler(Process $process)
{ {
$this->initConfig(); $this->initConfig();
$this->channelListener();
$consumer = new \Kafka\Consumer(); $consumer = new Consumer();
$consumer->setLogger(new Logger()); $consumer->setLogger(new Logger());
$consumer->start(function ($topic, $part, $message) { $consumer->start(function ($topic, $part, $message) {
$this->channel->push([$topic, $part, $message]); $this->channel->push([$topic, $part, $message]);
@@ -61,10 +61,27 @@ class Kafka extends \Snowflake\Process\Process
/** /**
* 监听通道数据传递 * 监听通道数据传递
*/ */
protected function listener() public function channelListener()
{ {
$this->channel = new Channel(1000);
Coroutine::create(function () {
$group = new WaitGroup(); $group = new WaitGroup();
while ([$topic, $part, $message] = $this->channel->pop()) { while ([$topic, $part, $message] = $this->channel->pop()) {
$this->handlerExecute($group, $topic, $part, $message);
}
$group->wait();
});
}
/**
* @param $group
* @param $topic
* @param $part
* @param $message
*/
protected function handlerExecute($group, $topic, $part, $message)
{
try { try {
$namespace = 'App\\Kafka\\' . ucfirst($topic) . 'Consumer'; $namespace = 'App\\Kafka\\' . ucfirst($topic) . 'Consumer';
if (!class_exists($namespace)) { if (!class_exists($namespace)) {
@@ -72,7 +89,7 @@ class Kafka extends \Snowflake\Process\Process
} }
$class = Snowflake::createObject($namespace); $class = Snowflake::createObject($namespace);
if (!($class instanceof ConsumerInterface)) { if (!($class instanceof ConsumerInterface)) {
continue; return;
} }
$group->add(); $group->add();
go(function () use ($group, $class, $topic, $part, $message) { go(function () use ($group, $class, $topic, $part, $message) {
@@ -85,8 +102,6 @@ class Kafka extends \Snowflake\Process\Process
$this->application->error($exception->getMessage()); $this->application->error($exception->getMessage());
} }
} }
$group->wait();
}
} }