![](/img/trans.png)
[英]How do I get the AWS PHP SDK to find the credentials I stored in Elastic Beanstalk environment variables?
[英]How to delete SQS message in AWS Elastic Beanstalk Worker Environments using PHP SDK
我有一個使用SQS的AWS Elastic Beanstalk Worker環境設置。 SQS正在發布到URL,該URL是使用Laravel的代碼庫的終結點。 從此端點開始,它接收消息並處理有效負載。 我的某些過程很耗時,需要20多個分鍾才能完成。 我正在從端點發送回成功響應,但是由於要花費大量時間來完成該過程,因此大多數情況下,消息將進入SQS中的飛行模式。 我正在嘗試使用PHP SDK進行deleteMessage()調用,但是我需要傳遞ReceiptHandle
來刪除消息。 根據此處的文檔,SQS不會將ReceiptHandle
發布到我的應用程序,因此無法進行刪除調用。 處於inFlight
模式的消息的問題在於,下次將再次調用該消息,因此該過程被重復。
完成該過程后,如何刪除一條消息?
我當前的代碼如下:
$worker->process(
$request->header('X-Aws-Sqsd-Queue'), $job, [
'maxTries' => 0,
'delay' => 0
]
);
return $this->response([
'Processed ' . $job->getJobId()
]);
其中worker是...的實例
Illuminate\Queue\Worker;
response
函數是對數據進行json編碼並以200
響應
您必須具有ReceiptHandle才能刪除隊列中的消息。 下面的核心PHP中的功能是讀取和刪除隊列中的消息。
function ReadMessages($client,$queueUrl){
try {
$result = $client->receiveMessage(array(
'AttributeNames' => ['SentTimestamp'],
'MaxNumberOfMessages' => 1,
'MessageAttributeNames' => ['All'],
'QueueUrl' => $queueUrl, // REQUIRED
'WaitTimeSeconds' => 0,
));
if (count($result->get('Messages')) > 0) {
var_dump($result->get('Messages')[0]);
//to delete a message pass the receipt Handle
$result = $client->deleteMessage([
'QueueUrl' => $queueUrl, // REQUIRED
'ReceiptHandle' => $result->get('Messages')[0]['ReceiptHandle'] // REQUIRED
]);
} else {
echo "No messages in queue. \n";
}
}
catch (AwsException $e) {
// output error message if fails
return 'error';
error_log($e->getMessage());
}
}
采取一些變通辦法,以便獲得一個ReceiptHandle來刪除隊列中的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.