初始化
This commit is contained in:
commit
9b75fa7912
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/vendor/
|
||||||
|
/.idea/
|
||||||
|
/composer.lock
|
15
README.md
Normal file
15
README.md
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# rocket-mq-thinkphp 适配客户端
|
||||||
|
|
||||||
|
## 使用说明
|
||||||
|
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
|
|
||||||
|
### 配置
|
||||||
|
|
||||||
|
|
||||||
|
### 生产者
|
||||||
|
|
||||||
|
|
||||||
|
### 消费者
|
42
composer.json
Normal file
42
composer.json
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "tm_xls/rocket-mq-client-thinkphp",
|
||||||
|
"description": "rocket-mq-thinkphp 适配客户端",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"license": "proprietary",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "zyimm",
|
||||||
|
"email": "email@example.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"tm\\xls\\rocketMq\\thinkphp\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"think": {
|
||||||
|
"config": {
|
||||||
|
"rocket_mq": "src/config.php"
|
||||||
|
},
|
||||||
|
"route": {
|
||||||
|
"rocket_route": "src/route.php"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.2",
|
||||||
|
"topthink/framework": "5.1.*",
|
||||||
|
"guzzlehttp/guzzle": "6.*|7.*",
|
||||||
|
"react/http": "1.*",
|
||||||
|
"react/event-loop": "1.*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"react/async": "^3.1",
|
||||||
|
"tm_xls/composer-thinkphp-installer": "dev-master"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"allow-plugins": {
|
||||||
|
"tm_xls/composer-thinkphp-installer": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
src/Client.php
Normal file
15
src/Client.php
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp;
|
||||||
|
|
||||||
|
use tm\xls\rocketMq\thinkphp\connection\Connection;
|
||||||
|
use ttm\xls\rocketMq\thinkphp\producer\Producer;
|
||||||
|
|
||||||
|
|
||||||
|
class Client
|
||||||
|
{
|
||||||
|
public static function producer(Connection $connection): Producer
|
||||||
|
{
|
||||||
|
return new Producer($connection);
|
||||||
|
}
|
||||||
|
}
|
11
src/config.php
Normal file
11
src/config.php
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return [
|
||||||
|
'host' => '',
|
||||||
|
'callback' => '/rocketmq/producer/notify',
|
||||||
|
'subscribe' => [
|
||||||
|
|
||||||
|
]
|
||||||
|
];
|
60
src/connection/Config.php
Normal file
60
src/connection/Config.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\connection;
|
||||||
|
|
||||||
|
class Config
|
||||||
|
{
|
||||||
|
|
||||||
|
private $host;
|
||||||
|
|
||||||
|
private $timeOut;
|
||||||
|
|
||||||
|
public function __construct(array $configs = [])
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach ($configs as $key => $val){
|
||||||
|
if(method_exists($key, $this)){
|
||||||
|
call_user_func([$this, $key], $val);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getHost()
|
||||||
|
{
|
||||||
|
return $this->host;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $host
|
||||||
|
*/
|
||||||
|
public function setHost($host): void
|
||||||
|
{
|
||||||
|
$this->host = $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getTimeOut()
|
||||||
|
{
|
||||||
|
return $this->timeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $timeOut
|
||||||
|
*/
|
||||||
|
public function setTimeOut($timeOut): void
|
||||||
|
{
|
||||||
|
$this->timeOut = $timeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getProducerUrl(): string
|
||||||
|
{
|
||||||
|
return $this->getHost().'notifyUsing';
|
||||||
|
}
|
||||||
|
}
|
53
src/connection/Connection.php
Normal file
53
src/connection/Connection.php
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\connection;
|
||||||
|
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
|
||||||
|
class Connection
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Client
|
||||||
|
*/
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Config
|
||||||
|
*/
|
||||||
|
public $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化连接
|
||||||
|
*
|
||||||
|
* @param array $config
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function init(array $config = [])
|
||||||
|
{
|
||||||
|
$this->config = new Config($config);
|
||||||
|
$this->client = new Client([
|
||||||
|
'base_uri' => $this->config->getHost(),
|
||||||
|
'timeout' => $this->config->getTimeOut(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取连接客户端
|
||||||
|
*
|
||||||
|
* @param bool $state
|
||||||
|
*
|
||||||
|
* @return Client
|
||||||
|
*/
|
||||||
|
public function getClient(bool $state = false): Client
|
||||||
|
{
|
||||||
|
if (is_null($this->client) || $state === true) {
|
||||||
|
$this->init();
|
||||||
|
}
|
||||||
|
return $this->client;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
51
src/consumer/Consumer.php
Normal file
51
src/consumer/Consumer.php
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\consumer;
|
||||||
|
|
||||||
|
use React\EventLoop\Loop;
|
||||||
|
use tm\xls\rocketMq\thinkphp\consumer\message\Message;
|
||||||
|
|
||||||
|
class Consumer
|
||||||
|
{
|
||||||
|
private $message;
|
||||||
|
|
||||||
|
public function __construct(array $data)
|
||||||
|
{
|
||||||
|
$this->message = new Message();
|
||||||
|
$this->message->setMessageBody($data['messageBody'] ?? '');
|
||||||
|
$this->message->setTopic($data['topic'] ?? '');
|
||||||
|
$this->message->setTag($data['tag'] ?? '');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分发订阅
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function distribute()
|
||||||
|
{
|
||||||
|
//事件循环
|
||||||
|
$loop = Loop::get();
|
||||||
|
$key = $this->message->getTopic().$this->message->getTag();
|
||||||
|
$subscribes = $this->getSubscribe()[$key] ?? [];
|
||||||
|
foreach ($subscribes as $subscribe){
|
||||||
|
$loop->addTimer(0, function () use ($subscribe){
|
||||||
|
call_user_func([app()->make($subscribe, [
|
||||||
|
$this->message
|
||||||
|
]), 'handle']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$loop->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getSubscribe
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getSubscribe():array
|
||||||
|
{
|
||||||
|
return config('rocket_mq.subscribe');
|
||||||
|
}
|
||||||
|
}
|
24
src/consumer/command/Listen.php
Normal file
24
src/consumer/command/Listen.php
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\consumer\command;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use React\Http\HttpServer;
|
||||||
|
use React\Http\Message\Response;
|
||||||
|
use React\Socket\SocketServer;
|
||||||
|
|
||||||
|
class Listen
|
||||||
|
{
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$http = new HttpServer(function (ServerRequestInterface $request) {
|
||||||
|
return Response::plaintext(
|
||||||
|
"Hello World!\n"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
$socket = new SocketServer('127.0.0.1:8080');
|
||||||
|
$http->listen($socket);
|
||||||
|
}
|
||||||
|
}
|
8
src/consumer/contract/ListenerInterface.php
Normal file
8
src/consumer/contract/ListenerInterface.php
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\consumer\contract;
|
||||||
|
|
||||||
|
interface ListenerInterface
|
||||||
|
{
|
||||||
|
public function handle();
|
||||||
|
}
|
60
src/consumer/message/Message.php
Normal file
60
src/consumer/message/Message.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace tm\xls\rocketMq\thinkphp\consumer\message;
|
||||||
|
|
||||||
|
class Message
|
||||||
|
{
|
||||||
|
private $messageBody;
|
||||||
|
|
||||||
|
private $tag;
|
||||||
|
|
||||||
|
private $topic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getMessageBody()
|
||||||
|
{
|
||||||
|
return $this->messageBody;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $message_body
|
||||||
|
*/
|
||||||
|
public function setMessageBody(string $message_body): void
|
||||||
|
{
|
||||||
|
$this->messageBody = json_decode($message_body, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getTag()
|
||||||
|
{
|
||||||
|
return $this->tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $tag
|
||||||
|
*/
|
||||||
|
public function setTag($tag): void
|
||||||
|
{
|
||||||
|
$this->tag = $tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getTopic()
|
||||||
|
{
|
||||||
|
return $this->topic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $topic
|
||||||
|
*/
|
||||||
|
public function setTopic($topic): void
|
||||||
|
{
|
||||||
|
$this->topic = $topic;
|
||||||
|
}
|
||||||
|
}
|
60
src/producer/Producer.php
Normal file
60
src/producer/Producer.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ttm\xls\rocketMq\thinkphp\producer;
|
||||||
|
|
||||||
|
use GuzzleHttp\Exception\GuzzleException;
|
||||||
|
use GuzzleHttp\Exception\RequestException;
|
||||||
|
use GuzzleHttp\Pool;
|
||||||
|
use GuzzleHttp\Psr7\Request;
|
||||||
|
use GuzzleHttp\Psr7\Response;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use tm\xls\rocketMq\thinkphp\connection\Connection;
|
||||||
|
|
||||||
|
class Producer
|
||||||
|
{
|
||||||
|
private $connection;
|
||||||
|
|
||||||
|
public function __construct(Connection $connection)
|
||||||
|
{
|
||||||
|
$this->connection = $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function handleWithBatch(array $data)
|
||||||
|
{
|
||||||
|
$requests = function ($data) {
|
||||||
|
$uri = $this->connection->config->getHost();
|
||||||
|
foreach ($data as $item) {
|
||||||
|
yield new Request('POST', $uri, [], $item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//连接池
|
||||||
|
$pool = new Pool($this->connection->getClient(), $requests($data), [
|
||||||
|
'concurrency' => 5,
|
||||||
|
'fulfilled' => function (Response $response, $index) {
|
||||||
|
//todo 成功
|
||||||
|
},
|
||||||
|
'rejected' => function (RequestException $reason, $index) {
|
||||||
|
//todo 失败
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
$promise = $pool->promise();
|
||||||
|
$promise->wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单个
|
||||||
|
*
|
||||||
|
* @throws GuzzleException
|
||||||
|
*/
|
||||||
|
public function handle(array $data): ResponseInterface
|
||||||
|
{
|
||||||
|
return $this->connection->getClient()->request('post', ['json' => $data]);
|
||||||
|
}
|
||||||
|
}
|
20
src/route.php
Normal file
20
src/route.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use think\facade\Route;
|
||||||
|
use tm\xls\rocketMq\thinkphp\consumer\Consumer;
|
||||||
|
use function React\Async\coroutine;
|
||||||
|
|
||||||
|
$path = config('rocket_mq.callback', '/rocketmq/producer/notify');
|
||||||
|
//注册回调路由
|
||||||
|
Route::post($path, function () {
|
||||||
|
$promise = coroutine(function () {
|
||||||
|
app()->make(Consumer::class, [
|
||||||
|
request()->param()
|
||||||
|
])->distribute();
|
||||||
|
});
|
||||||
|
$promise->then(function () {
|
||||||
|
return 'success';
|
||||||
|
},function (){
|
||||||
|
return 'error';
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user