我想指出给那些可能会遇到同样问题的人,尽管编辑
SqsQueue.php
可行,但它很容易被
composer install
或
composer update
重置。另一个选择是为SQS FIFO实现一个新的
Illuminate\Queue\Connectors\ConnectorInterface
,然后将其添加到Laravel的队列管理器中。
我的方法如下:
- 创建一个新的
SqsFifoQueue
类,它继承Illuminate\Queue\SqsQueue
,但支持SQS FIFO。
- 创建一个新的
SqsFifoConnector
类,它继承Illuminate\Queue\Connectors\SqsConnector
,它将使用SqsFifoQueue
建立连接。
- 创建一个新的
SqsFifoServiceProvider
,将SqsFifoConnector
注册到Laravel的队列管理器中。
- 将
SqsFifoServiceProvider
添加到您的config/app.php
文件中。
- 更新
config/queue.php
文件以使用新的SQS FIFO队列驱动程序。
示例:
- 创建一个新的
SqsFifoQueue
类,它继承Illuminate\Queue\SqsQueue
,但支持SQS FIFO。
<?php
class SqsFifoQueue extends \Illuminate\Queue\SqsQueue
{
public function pushRaw($payload, $queue = null, array $options = [])
{
$response = $this->sqs->sendMessage([
'QueueUrl' => $this->getQueue($queue),
'MessageBody' => $payload,
'MessageGroupId' => uniqid(),
'MessageDeduplicationId' => uniqid(),
]);
return $response->get('MessageId');
}
}
创建一个新的
SqsFifoConnector
类,继承
Illuminate\Queue\Connectors\SqsConnector
,使用
SqsFifoQueue
建立连接。
<?php
use Aws\Sqs\SqsClient;
use Illuminate\Support\Arr;
class SqsFifoConnector extends \Illuminate\Queue\Connectors\SqsConnector
{
public function connect(array $config)
{
$config = $this->getDefaultConfiguration($config);
if ($config['key'] && $config['secret']) {
$config['credentials'] = Arr::only($config, ['key', 'secret']);
}
return new SqsFifoQueue(
new SqsClient($config), $config['queue'], Arr::get($config, 'prefix', '')
);
}
}
创建一个新的SqsFifoServiceProvider
,将SqsFifoConnector
注册到Laravel队列管理器中。
<?php
class SqsFifoServiceProvider extends \Illuminate\Support\ServiceProvider
{
public function register()
{
$this->app->afterResolving('queue', function ($manager) {
$manager->addConnector('sqsfifo', function () {
return new SqsFifoConnector;
});
});
}
}
将SqsFifoServiceProvider
添加到您的config/app.php
中。
<?php
return [
'providers' => [
...
SqsFifoServiceProvider::class,
],
];
更新config/queue.php
文件以使用新的SQS FIFO队列驱动程序。
<?php
return [
'default' => 'sqsfifo',
'connections' => [
'sqsfifo' => [
'driver' => 'sqsfifo',
'key' => 'my_key'
'secret' => 'my_secret',
'queue' => 'my_queue_url',
'region' => 'my_sqs_region',
],
],
];
此时,您的队列应支持 SQS FIFO 队列。
无耻地自我推销:在上述步骤中,我创建了一个laravel-sqs-fifo composer包来处理此问题,在https://github.com/maqe/laravel-sqs-fifo。
config/queue.php
中的sqsfifo
连接中,但除此之外,这个功能非常完美! - Ben Poulson