隊(duì)列使用示例
更新時(shí)間:
本文介紹使用PHP SDK發(fā)送SMQ消息時(shí)的準(zhǔn)備工作及示例代碼。
準(zhǔn)備工作
CreateQueueAndSendMessage.php的代碼最上方有一些設(shè)置,使用SDK時(shí)需按照注釋進(jìn)行設(shè)置。
// require替換為composer下載的vendor下的autoload文件。 require_once __DIR__ . '/vendor/autoload.php'; // 代碼里需要用的一些 PHP class。 use AliyunMNS\Client; use AliyunMNS\Requests\SendMessageRequest; use AliyunMNS\Requests\CreateQueueRequest; use AliyunMNS\Exception\MnsException;
消息體編碼選擇
當(dāng)消息體無特殊字符時(shí),建議您不使用Base64編碼。
發(fā)送消息時(shí)使用
message.setMessageBodyAsRawString
方法設(shè)置消息體。接收消息時(shí)使用
meesage.getMessageBodyAsRawString
方法獲取消息體。
發(fā)送消息
完整示例代碼下載,請(qǐng)參見CreateQueueAndSendMessage。
// 1.首先獲取Queue的實(shí)例。
// PHP SDK默認(rèn)會(huì)對(duì)發(fā)送的消息做Base64 Encode,對(duì)接收到的消息做Base64 Decode。
// 如果不希望SDK做這樣的Base64操作,可以在getQueueRef的時(shí)候,傳入?yún)?shù)$base64=FALSE。即$queue = $this->client->getQueueRef($queueName, FALSE);
$queue = $this->client->getQueueRef($queueName);
$messageBody = "test";
// 2.生成一個(gè)SendMessageRequestItem對(duì)象。
// SendMessageRequestItem對(duì)象本身也包含了DelaySeconds和Priority屬性可以設(shè)置。
// 對(duì)于Message的屬性,請(qǐng)參見QueueMessage。
$bodyMD5 = md5(base64_encode($messageBody));
$request = new SendMessageRequestItem($messageBody);
try
{
$res = $queue->sendMessage($request)
// 3.消息發(fā)送成功。
echo "MessageSent! \n";
}
catch (MnsException $e)
{
// 4.可能因?yàn)榫W(wǎng)絡(luò)錯(cuò)誤,或MessageBody過大等原因造成發(fā)送消息失敗,這里CatchException并做對(duì)應(yīng)的處理。
echo "SendMessage Failed: " . $e;
return;
}
接收和刪除消息
完整示例代碼下載,請(qǐng)參見CreateQueueAndSendMessage。
$receiptHandle = NULL;
try
{
// 1.直接調(diào)用receiveMessage函數(shù)。
// receiveMessage函數(shù)接受waitSeconds參數(shù),無特殊情況建議設(shè)置為30。
// waitSeconds非0表示這次receiveMessage是一次http long polling,如果queue內(nèi)沒有message,那么這次request會(huì)在server端等到queue內(nèi)有消息才返回。最長等待時(shí)間為waitSeconds的值,最大為30。
$res = $queue->receiveMessage(30);
echo "ReceiveMessage Succeed! \n";
if (strtoupper($bodyMD5) == $res->getMessageBodyMD5())
{
echo "You got the message sent by yourself! \n";
}
// 2.獲取ReceiptHandle,這是一個(gè)有時(shí)效性的Handle,可以用來設(shè)置Message的各種屬性和刪除Message。更多信息,請(qǐng)參見QueueMessage。
$receiptHandle = $res->getReceiptHandle();
}
catch (MnsException $e)
{
// 3.和CreateQueue和SendMessage一樣,ReceiveMessage也有可能出錯(cuò),所以加上CatchException并做對(duì)應(yīng)的處理。
echo "ReceiveMessage Failed: " . $e;
return;
}
// 這里是您處理消息的邏輯。Sample里就直接略過這一步。
// 如果這里發(fā)生了程序崩潰或卡住等異常情況,對(duì)應(yīng)的Message會(huì)在VisibilityTimeout之后重新可見,從而可以被其他進(jìn)程處理,避免消息丟失。
// 4.消息已經(jīng)處理完成,從隊(duì)列里刪除這條消息。
try
{
// 5.直接調(diào)用deleteMessage。
$res = $queue->deleteMessage($receiptHandle);
echo "DeleteMessage Succeed! \n";
}
catch (MnsException $e)
{
// 6.這里CatchException并做異常處理。
// 如果是receiptHandle已經(jīng)過期,那么ErrorCode是MessageNotExist,表示通過這個(gè)receiptHandle已經(jīng)找不到對(duì)應(yīng)的消息。
// 為了保證receiptHandle不過期,VisibilityTimeout的設(shè)置需要保證足夠消息處理完成。并且在消息處理過程中,也可以調(diào)用changeMessageVisibility這個(gè)函數(shù)來延長消息的VisibilityTimeout時(shí)間。
echo "DeleteMessage Failed: " . $e;
return;
}
文檔內(nèi)容是否對(duì)您有幫助?