【问题标题】:How to send json message to sqs by using laravel?如何使用 laravel 向 sqs 发送 json 消息?
【发布时间】:2023-03-30 01:37:01
【问题描述】:

我是 Laravel 的初学者。在我的任务中,我需要做以下几点:-

  1. 在控制器中,将 csv 文件的内容存储在一个数组中。 --- 完成
  2. 在同一个控制器中,使用 laravel 将步骤 1.array 以 json 格式发送到 sqs (amazon)。 --- 待处理

  3. 对于第 2 步),我已经设置了 config/queue.php

'sqs' => [
            'driver' => 'sqs',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxx'),
            'queue' => env('SQS_QUEUE', 'xxxxx'),
            'region' => env('AWS_DEFAULT_REGION', 'ap-northeast-1'),
        ],

还更改了 .env 文件

AWS_ACCESS_KEY_ID=xxxx
AWS_SECRET_ACCESS_KEY=xxxxxxx
SQS_QUEUE=data_queue_name_aws
  1. 创建了一个作业 php artisan make:job SendMessageSQS

  2. 致电SendMessageSQS::dispatch();

  3. SQS 收到消息

{"displayName":"App\\Jobs\\SendMessageSQS","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"delay":null,"timeout":null,"timeoutAt":null,
  "data":{"commandName":"App\\Jobs\\SendMessageSQS","command":"O:21:\"App\\Jobs\\SendMessageSQS\":3:{s:7:\"\u0000*\u0000item\";s:7:\"testing\";s:10:\"connection\";
  s:7:\"sqs\";s:6:\"\u0000*\u0000job\";N;}"}}
  1. 如何发送
$userIDs = [1,2,3]; // array values from csv file column `user-is`
$sendMessageSqs["file-name"] = "test-sqs-1";
$sendMessageSqs["user-id"] = $userIDs;
  1. 实际结果:SQS 应按以下格式存储
{"file-name":"test-sqs-1","user-id":"1,2,3"}

【问题讨论】:

  • 这看起来是个好问题,但我建议不要在这里要求“逐步”说明。回答者会以他们喜欢的任何方式提供帮助 - 毕竟他们是志愿者 - 但他们不会知道您的用例的确切细微差别。问题作者的工作是从答案中获取提示并将其应用于他们的特定情况。编程不仅仅是复制和粘贴的问题——程序员应该准确地理解他们的代码在做什么。

标签: php laravel-5 amazon-sqs


【解决方案1】:

您可以发送原始消息:

Queue::connection('sqs')->pushRaw('payload_body', 'queue_name');

一般来说,它调用SqsQueue->pushRaw 方法,该方法从实际发送消息的aws-sdk-php 调用SqsClient

【讨论】:

  • 如果你想在 .env 文件 (SQS_QUEUE) 上使用队列名称,你可以调用 Queue::connection('sqs')->pushRaw('body');
【解决方案2】:

标准 laravel 队列无法实现您想要做的事情。您在作业中看到的额外元数据是为了让 laravel 可以正确处理和路由作业,可以对模型进行反序列化等。

您可以将原始消息直接推送到aws-sdk 库的队列中,也可以使用下面的包来实现自定义队列驱动程序。

https://github.com/dusterio/laravel-plain-sqs

【讨论】:

  • 您好 Atymic,感谢您的快速回复。我试过但显示错误““/Users/smartshopping/workspace/laravel-projects/smartsearch-datasale/storage/logs”中没有现有目录,并且它不可构建:权限被拒绝”
  • 以上问题“xyz/storage/logs”中没有现有目录,其不可构建已从php artisan optimize:clear 解决。但是得到这个错误 Method Dusterio\PlainSqs\Jobs\DispatcherJob::handle() does not exist
  • 我在 vendor/dusterio/laravel-plain-sqs/src/Jobs/DispatcherJob.php 中添加了 handle() 函数。现在,没有错误,但在 sqs 中没有收到消息。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2010-12-12
  • 2023-03-23
  • 2020-02-18
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多