全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息服务

队列使用手册

更新时间:2017-06-07 13:26:11

本文档介绍如何使用php sdk,完成创建队列、发送消息、接收删除消息和删除队列操作。

1. 准备

  • 下载最新版php sdk,解压后进入php_sdk/Samples/Queue子目录;
  • 打开CreateQueueAndSendMessage.php文件,在文件的最下几行,配置AccessKeyID、AccessKeySecret和Endpoint;
  • CreateQueueAndSendMessage的代码顶部有一些设置,在使用SDK的时候需要做同样的设置
  1. // require sdk里自带的一个autoload文件即可
  2. require_once(dirname(dirname(dirname(__FILE__))).'/mns-autoloader.php');
  3. // 代码里需要用的一些php class
  4. use AliyunMNS\Client;
  5. use AliyunMNS\Requests\SendMessageRequest;
  6. use AliyunMNS\Requests\CreateQueueRequest;
  7. use AliyunMNS\Exception\MnsException;

2. 创建队列

  • 如果之前未创建过队列,那么首先需要创建队列。默认创建的队列名称是 CreateQueueAndSendMessageExample,也可以修改代码指定队列名称;
  1. // 1. 首先初始化一个client
  2. $this->client = new Client($this->endPoint, $this->accessId, $this->accessKey);
  3. // 2. 生成一个CreateQueueRequest对象。CreateQueueRequest还可以接受一个QueueAttributes参数,用来初始化生成的queue的属性。
  4. // 2.1 对于queue的属性,请参考help.aliyun.com/document_detail/27476.html
  5. $request = new CreateQueueRequest($queueName);
  6. try
  7. {
  8. $res = $this->client->createQueue($request);
  9. // 2.2 CreateQueue成功
  10. echo "QueueCreated! \n";
  11. }
  12. catch (MnsException $e)
  13. {
  14. // 2.3 可能因为网络错误,或者Queue已经存在等原因导致CreateQueue失败,这里CatchException并做对应的处理
  15. echo "CreateQueueFailed: " . $e . "\n";
  16. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  17. return;
  18. }

3. 发送消息

  • 创建完队列之后,就可以开始发送消息到队列中了;
  1. // 1. 首先获取Queue的实例
  2. // 1.1 PHP SDK默认会对发送的消息做Base64 Encode,对接收到的消息做Base64 Decode。
  3. // 1.2 如果不希望SDK做这样的Base64操作,可以在getQueueRef的时候,传入参数$base64=FALSE。即$queue = $this->client->getQueueRef($queueName, FALSE);
  4. $queue = $this->client->getQueueRef($queueName);
  5. $messageBody = "test";
  6. // 2. 生成一个SendMessageRequest对象
  7. // 2.1 SendMessageRequest对象本身也包含了DelaySeconds和Priority属性可以设置。
  8. // 2.2 对于Message的属性,请参考help.aliyun.com/document_detail/27477.html
  9. $request = new SendMessageRequest($messageBody);
  10. try
  11. {
  12. $res = $queue->sendMessage($request);
  13. // 3. 消息发送成功
  14. echo "MessageSent! \n";
  15. }
  16. catch (MnsException $e)
  17. {
  18. // 4. 可能因为网络错误,或MessageBody过大等原因造成发送消息失败,这里CatchException并做对应的处理。
  19. echo "SendMessage Failed: " . $e . "\n";
  20. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  21. return;
  22. }

4. 接收和删除消息

  • 现在队列里已经有了一条消息,我们可以来尝试接收消息。
  • 消息服务MNS的Message有一项属性叫做NextVisibleTime。这是一项非常有用和重要的属性,具体描述请参照http://help.aliyun.com/document_detail/27477.html 页面里对应的解释。
  1. $receiptHandle = NULL;
  2. try
  3. {
  4. // 1. 直接调用receiveMessage函数
  5. // 1.1 receiveMessage函数接受waitSeconds参数,无特殊情况这里都是建议设置为30
  6. // 1.2 waitSeconds非0表示这次receiveMessage是一次http long polling,如果queue内刚好没有message,那么这次request会在server端等到queue内有消息才返回。最长等待时间为waitSeconds的值,最大为30。
  7. $res = $queue->receiveMessage(30);
  8. echo "ReceiveMessage Succeed! \n";
  9. // 2. 获取ReceiptHandle,这是一个有时效性的Handle,可以用来设置Message的各种属性和删除Message。具体的解释请参考:help.aliyun.com/document_detail/27477.html 页面里的ReceiptHandle
  10. $receiptHandle = $res->getReceiptHandle();
  11. }
  12. catch (MnsException $e)
  13. {
  14. // 3. 像前面的CreateQueue和SendMessage一样,我们认为ReceiveMessage也是有可能出错的,所以这里加上CatchException并做对应的处理。
  15. echo "ReceiveMessage Failed: " . $e . "\n";
  16. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  17. return;
  18. }
  19. // 这里是用户自己的处理消息的逻辑。Sample里就直接略过这一步了。
  20. // 如果这里发生了程序崩溃或卡住等异常情况,对应的Message会在VisibilityTimeout之后重新可见,从而可以被其他进程处理,避免消息丢失。
  21. // 4. 现在消息已经处理完了。我们可以从队列里删除这条消息了。
  22. try
  23. {
  24. // 5. 直接调用deleteMessage即可。
  25. $res = $queue->deleteMessage($receiptHandle);
  26. echo "DeleteMessage Succeed! \n";
  27. }
  28. catch (MnsException $e)
  29. {
  30. // 6. 这里CatchException并做异常处理
  31. // 6.1 如果是receiptHandle已经过期,那么ErrorCode是MessageNotExist,表示通过这个receiptHandle已经找不到对应的消息。
  32. // 6.2 为了保证receiptHandle不过期,VisibilityTimeout的设置需要保证足够消息处理完成。并且在消息处理过程中,也可以调用changeMessageVisibility这个函数来延长消息的VisibilityTimeout时间。
  33. echo "DeleteMessage Failed: " . $e . "\n";
  34. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  35. return;
  36. }

5. 删除队列

  • Sample里最后会删除这个测试队列
  1. try {
  2. $this->client->deleteQueue($queueName);
  3. echo "DeleteQueue Succeed! \n";
  4. } catch (MnsException $e) {
  5. echo "DeleteQueue Failed: " . $e;
  6. return;
  7. }
本文导读目录