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

队列使用手册

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

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

1. 准备

  1. 下载最新版csharp sdk,解压后将工程导入到VisualStudio;
  2. 工程里有4个项目,其中一个是AliyunSDK_MNS,这个就是SDK所在的项目。右击这个项目名,选择重新生成,可以在项目的bin目录下找到生成的Aliyun.MNS.dll

    2.1 其他几个项目里都需要引用这个生成的dll,请配置好其他几个项目的“引用”

  3. 在AliyunSDK_MNS_Sample这个项目里,有我们接下来会介绍的队列操作的Sample:SyncOperationSample.cs

    3.1 将AliyunSDK_MNS_Sample这个项目设置为启动项,并将SyncOperationSample设置为启动对象

    3.2 打开SyncOperationSample.cs文件,在文件的最上几行,配置AccessKeyID、AccessKeySecret和Endpoint;

2. 创建队列

  • 如果之前未创建过队列,那么首先需要创建队列。默认创建的队列名称是 myqueue,也可以修改代码指定队列名称;
  1. // 1. 这里我们指定了Queue的一些属性,对于Queue的属性,请参考 http://help.aliyun.com/document_detail/27476.html
  2. var createQueueRequest = new CreateQueueRequest
  3. {
  4. QueueName = _queueName,
  5. Attributes =
  6. {
  7. // VisibilityTimeout是最重要的属性,默认为30秒,请务必参考Queue的属性页面里的详细介绍
  8. VisibilityTimeout = 30,
  9. MaximumMessageSize = 40960,
  10. MessageRetentionPeriod = 345600,
  11. // PollingWaitSeconds是非常重要的长轮询超时时间
  12. PollingWaitSeconds = 30
  13. }
  14. };
  15. try
  16. {
  17. // 2. 创建队列
  18. // 2.1 如果不需要特别指定Queue的属性,那么这里也可以直接使用client.CreateQueue(_queueName);
  19. var queue = client.CreateQueue(createQueueRequest);
  20. Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
  21. }
  22. catch (MNSException me)
  23. {
  24. // 3. 如果创建队列出错,这里可以根据具体的错误Code做处理
  25. // 3.1 也可以分别Catch QueueAlreadyExistException等做单独处理
  26. Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
  27. }
  28. catch (Exception ex)
  29. {
  30. Console.WriteLine("Create queue failed, exception info: " + ex.Message);
  31. }

3. 发送消息

  • 创建完队列之后,就可以开始发送消息到队列中了;
  1. try
  2. {
  3. // 1. 获取Queue的实例
  4. var nativeQueue = client.GetNativeQueue(_queueName);
  5. // 2. 生成SendMessageRequest,可以对Message有一些额外的属性设置
  6. var sendMessageRequest = new SendMessageRequest("阿里云<MessageBody>计算");
  7. // 3. 发送消息
  8. // 3.1 也可以直接使用nativeQueue.SendMessage("MessageBody");
  9. var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
  10. Console.WriteLine("Send message succeed“);
  11. }
  12. catch (MNSException me)
  13. {
  14. // 3. 如果创建队列出错,这里可以根据具体的错误Code做处理
  15. // 3.1 也可以分别Catch QueueNotExistException等做单独处理
  16. Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
  17. }
  18. catch (Exception ex)
  19. {
  20. Console.WriteLine("Send message failed, exception info: " + ex.Message);
  21. }

4. 接收和删除消息

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

5. 删除队列

  • Sample里最后会删除这个测试队列
  1. try
  2. {
  3. var deleteQueueResponse = client.DeleteQueue(deleteQueueRequest);
  4. }
  5. catch (MNSException me)
  6. {
  7. Console.WriteLine("DeleteQueue Failed! ErrorCode: " + me.ErrorCode);
  8. }
  9. catch (Exception ex)
  10. {
  11. Console.WriteLine("Delete queue failed, exception info: " + ex.Message);
  12. }
本文导读目录