This commit is contained in:
2020-10-10 11:30:10 +08:00
parent 25bd5b52af
commit bc8905c863
+44 -6
View File
@@ -6,6 +6,8 @@ namespace Kafka;
use Snowflake\Exception\ConfigException; use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake; use Snowflake\Snowflake;
use Swoole\Coroutine\Channel;
use Swoole\Coroutine\WaitGroup;
use Swoole\Process; use Swoole\Process;
use Snowflake\Abstracts\Config as SConfig; use Snowflake\Abstracts\Config as SConfig;
@@ -16,11 +18,14 @@ use Snowflake\Abstracts\Config as SConfig;
class Kafka extends \Snowflake\Process\Process class Kafka extends \Snowflake\Process\Process
{ {
/** @var Channel */
protected $channel;
/** /**
* @param Process $process
* @throws ConfigException * @throws ConfigException
*/ */
public function onHandler(Process $process) public function initConfig()
{ {
$kafka = SConfig::get('kafka'); $kafka = SConfig::get('kafka');
$config = \Kafka\ConsumerConfig::getInstance(); $config = \Kafka\ConsumerConfig::getInstance();
@@ -32,23 +37,56 @@ class Kafka extends \Snowflake\Process\Process
$config->setBrokerVersion($kafka['version']); $config->setBrokerVersion($kafka['version']);
$config->setTopics($kafka['topics']); $config->setTopics($kafka['topics']);
$this->channel = new Channel(1000);
$this->initCoroutine();
}
/**
* @param Process $process
* @throws ConfigException
*/
public function onHandler(Process $process)
{
$this->initConfig();
$consumer = new \Kafka\Consumer(); $consumer = new \Kafka\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]);
});
}
/**
*
*/
public function initCoroutine()
{
$group = new WaitGroup();
while ([$topic, $part, $message] = $this->channel->pop()) {
try { try {
$namespace = 'App\\Kafka\\' . ucfirst($topic) . 'Consumer'; $namespace = 'App\\Kafka\\' . ucfirst($topic) . 'Consumer';
if (!class_exists($namespace)) { if (!class_exists($namespace)) {
return; return;
} }
$class = Snowflake::createObject($namespace); $class = Snowflake::createObject($namespace);
if ($class instanceof ConsumerInterface) { if (!($class instanceof ConsumerInterface)) {
$class->onHandler(new Struct($topic, $part, $message)); continue;
} }
$group->add();
go(function () use ($group, $class, $topic, $part, $message) {
defer(function () use ($group) {
$group->done();
});
$class->onHandler(new Struct($topic, $part, $message));
});
} catch (\Throwable $exception) { } catch (\Throwable $exception) {
$this->application->error($exception->getMessage()); $this->application->error($exception->getMessage());
} }
}); }
$group->wait();
} }
} }