本文介绍如何使用C# SDK中的sample代码,完成创建主题、创建队列、创建订阅和发布消息等操作。
步骤一:准备工作
下载最新版C# SDK,解压后将工程导入到VisualStudio。
找到工程里四个项目中SDK所在的项目AliyunSDK_MNS,右击项目名,选择重新生成,在bin目录下生成Aliyun.MNS.dll。
说明其他几个项目里都需要引用Aliyun.MNS.dll,请配置好其他几个项目的引用。
在项目AliyunSDK_MNS_Sample里进行配置。
将项目AliyunSDK_MNS_Sample设置为启动项,将SyncTopicOperations.cs设置为启动对象。
打开SyncTopicOperations.cs文件,配置以下内容:
AccessKey ID、AccessKey Secret
访问阿里云API的密钥对。
如果使用阿里云账号访问,请登录AccessKey管理页面创建和查看。
如果使用RAM用户访问,请登录阿里云访问控制控制台查看。
Endpoint
访问轻量消息队列(原 MNS)的接入地址,请登录轻量消息队列(原 MNS)控制台查看。具体操作,请参见获取接入点。
不同地域的接入地址不同。
步骤二:创建主题
如果之前未创建主题,那么首先需要创建主题。默认创建的主题名称是TestCSharpTopic,也可以修改代码指定主题名称。
// 1.生成一个CreateTopicRequest实例,参数传入topicName。这里可以同时传入TopicAttributes,以便在CreateTopic时同时设置自定义的Topic属性。
var createTopicRequest = new CreateTopicRequest
{
TopicName = _topicName
};
Topic topic = null;
try
{
topic = client.CreateTopic(createTopicRequest);
Console.WriteLine("Create topic successfully, topic name: {0}", topic.TopicName);
}
catch (MNSException me)
{
// 2.可能因为网络错误,或者Topic已经存在等原因导致CreateTopic失败,这里CatchException并做对应的处理,也可以分别Catch TopicAlreadyExistException等做单独处理。
Console.WriteLine("CreateTopic Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create topic failed, exception info: " + ex.Message);
return;
}
步骤三:创建队列
如果之前未创建队列,那么首先需要创建队列。默认创建的队列名称是myqueue,也可以修改代码指定队列名称。
// 1.这里我们指定了Queue的一些属性。对于Queue的属性,请参见Queue。
var createQueueRequest = new CreateQueueRequest
{
QueueName = _queueName,
Attributes =
{
// VisibilityTimeout是最重要的属性,默认为30秒。
VisibilityTimeout = 30,
MaximumMessageSize = 40960,
MessageRetentionPeriod = 345600,
// PollingWaitSeconds是非常重要的长轮询超时时间。
PollingWaitSeconds = 30
}
};
try
{
// 2.创建队列。如果不需要特别指定Queue的属性,也可以直接使用client.CreateQueue(_queueName)。
var queue = client.CreateQueue(createQueueRequest);
Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
// 3.如果创建队列出错,可以根据具体的错误Code做处理,也可以分别Catch QueueAlreadyExistException等做单独处理。
Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create queue failed, exception info: " + ex.Message);
}
步骤四:创建订阅
对已创建的主题进行订阅。
string region = "";
string accountId = "";
string queueName = "TestQueue";
try
{
// 1.生成SubscriptionAttributes,第二个参数是Subscription的Endpoint。
SubscribeResponse res = topic.Subscribe(_subscriptionName, "acs:mns:" + region +":" + accountId +":queues/" + queueName);
// 2.订阅成功。
Console.WriteLine("Subscribe succeed");
}
catch (MNSException me)
{
// 3.可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理。
Console.WriteLine("Subscribe Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Subscribe failed, exception info: " + ex.Message);
}
步骤五:发布消息
发布消息到主题中。
try
{
var response = topic.PublishMessage("message here </asdas\">");
// 1.发布成功。
Console.WriteLine("PublishMessage succeed! " + response.MessageId);
}
catch (MNSException me)
{
// 2.可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理。
Console.WriteLine("PublishMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("PublishMessage failed, exception info: " + ex.Message);
}
步骤六:从队列接收和删除消息
消息从主题推送到队列后,从队列中取出并删除该条消息。
try
{
// 1.直接调用receiveMessage函数。
// receiveMessage函数接受waitSeconds参数,无特殊情况建议设置为30。
// waitSeconds非0表示这次receiveMessage是一次http long polling,如果queue内刚好没有message,那么这次request会在server端等到queue内有消息才返回。最长等待时间为waitSeconds的值,最大为30。
var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
// 2.获取ReceiptHandle,这是一个有时效性的Handle,可以用来设置Message的各种属性和删除Message。更多信息,请参见QueueMessage。
_receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
// 3.和CreateQueue和SendMessage一样,ReceiveMessage也是有可能出错的,所以这里加上CatchException并做对应的处理。
Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}
// 这里是您自己处理消息的逻辑。Sample里就直接略过这一步了。
// 如果这里发生了程序崩溃或卡住等异常情况,对应的Message会在VisibilityTimeout之后重新可见,从而可以被其他进程处理,避免消息丢失。
// 4.消息处理完成,可以从队列里删除这条消息。
try
{
// 5.直接调用deleteMessage。
var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
// 6.这里CatchException并做异常处理。
// 如果是receiptHandle已经过期,那么ErrorCode是MessageNotExist,表示通过这个receiptHandle已经找不到对应的消息。
// 为了保证receiptHandle不过期,VisibilityTimeout的设置需要保证足够消息处理完成。并且在消息处理过程中,也可以调用changeMessageVisibility这个函数来延长消息的VisibilityTimeout时间。
Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete message failed, exception info: " + ex.Message);
}
步骤七:删除主题
删除测试主题。
try
{
client.DeleteTopic(_topicName);
Console.WriteLine("Delete topic succeed");
}
catch (Exception ex)
{
Console.WriteLine("Delete topic failed, exception info: " + ex.Message);
}
步骤八:删除队列
删除测试队列。
try
{
var deleteQueueResponse = client.DeleteQueue(deleteQueueRequest);
}
catch (MNSException me)
{
Console.WriteLine("DeleteQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete queue failed, exception info: " + ex.Message);
}
文档内容是否对您有帮助?