天天看點

MQ消息隊列.NET SDK的使用

作者:俏巴

概述

MQ消息隊列的SDK目前支援Java、C/C++及.NET三種語言,關于.NET SDK的使用目前因為版本更新的問題,使用者在使用的過程中多少會出現這樣或那樣的問題,特别是SDK中example的使用問題。本文主要介紹.NET SDK的使用注意事項及使用者可能遇到的問題。

準備工作

1、SDK下載下傳 下載下傳位址

連結

,建議下載下傳最新版本的SDK;

2、加載相關檔案到已經建立的.NET控制台項目,配置參考

;

3、配置管理器示例:

MQ消息隊列.NET SDK的使用

4、如果找不到x64,可以通過如下方式建立:

MQ消息隊列.NET SDK的使用

示例程式運作注意事項

1、基本資訊的錄入,具體建立方法可以在管理門戶完成,注意絕大部分的使用者測試環境都是在本地,是以請在公網區域建立Topic、生産者及消費者;
MQ消息隊列.NET SDK的使用
2、SDK sample 預設代碼的運作測試檔案是: ConsumerAndProducerForEx.cs,預設的示例程式并未給出ONSAddr的設定,且預設指向的是内網的位址,是以使用者完成了規定參數的配置後仍然無法連通,是以需要添加ONSAddr參數的配置,參數對應的是生産者或消費者的接入點,代碼修改示例如下:
ONSFactoryProperty factoryInfo = new ONSFactoryProperty();
factoryInfo.setFactoryProperty(ONSFactoryProperty.ONSAddr, "http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet");
factoryInfo.setFactoryProperty(ONSFactoryProperty.AccessKey, Ons_AccessKey);           

dll檔案的複制粘貼問題

直接複制SDK->lib->x64下的檔案到項目的bin->x64->Debug。

MQ消息隊列.NET SDK的使用

測試運作效果

MQ消息隊列.NET SDK的使用

新版本SDK使用參考

截止2019.2.16,目前最新的SDK版本為1.1.3。基本配置方式與之前一緻。隻是在參數設定的地方略有不同,示例如下:

private static ONSFactoryProperty getFactoryProperty()
 {
     ONSFactoryProperty factoryInfo = new ONSFactoryProperty();
     factoryInfo.setFactoryProperty(ONSFactoryProperty.NAMESRV_ADDR, "http://MQ_INST_1848217816617278_BaQUuiNE.mq-internet-access.mq-internet.aliyuncs.com:80");
     factoryInfo.setFactoryProperty(ONSFactoryProperty.AccessKey, Ons_AccessKey);
     factoryInfo.setFactoryProperty(ONSFactoryProperty.SecretKey, Ons_SecretKey);
     factoryInfo.setFactoryProperty(ONSFactoryProperty.ConsumerId, Ons_ConsumerId);
     factoryInfo.setFactoryProperty(ONSFactoryProperty.ProducerId, Ons_ProducerID);
     factoryInfo.setFactoryProperty(ONSFactoryProperty.PublishTopics, Ons_Topic);
    return factoryInfo;
 }           

中文編碼處理問題

處理思路:對發送的消息進行base64編碼,消費的消息進行base64解碼。
using System;
using System.Text;
using System.Threading;
using ons;

namespace test
{
    /// <summary>
    /// 消費監聽類
    /// </summary>
    public class MyMsgListener : MessageListener
    {
        public MyMsgListener()
        {
        }

        ~MyMsgListener()
        {
        }

        public override ons.Action consume(Message value, ConsumeContext context)
        {
            Byte[] text = Encoding.Default.GetBytes(value.getBody());
            string s = System.Text.Encoding.UTF8.GetString(text, 0, text.Length);
            Console.WriteLine(base64tstring.UnBase64String(s));
            return ons.Action.CommitMessage;
        }
    }

    /// <summary>
    /// base64編碼解碼類
    /// </summary>
    public class base64tstring {

        public static string ToBase64String(string value)
        {
            if (value == null || value == "")
            {
                return "";
            }
            byte[] bytes = Encoding.UTF8.GetBytes(value);
            return Convert.ToBase64String(bytes);
        }

        public static string UnBase64String(string value)
        {
            if (value == null || value == "")
            {
                return "";
            }
            byte[] bytes = Convert.FromBase64String(value);
            return Encoding.UTF8.GetString(bytes);
        }
    }

    class ConsumerAndProducerForEx
    {
        static void Main(string[] args)
        {
            ONSFactoryProperty factoryInfo = new ONSFactoryProperty();
            factoryInfo.setFactoryProperty(ONSFactoryProperty.AccessKey, "******");

            factoryInfo.setFactoryProperty(ONSFactoryProperty.SecretKey, "******");
            factoryInfo.setFactoryProperty(ONSFactoryProperty.ConsumerId, "GID_test");
            factoryInfo.setFactoryProperty(ONSFactoryProperty.ProducerId, "GID_test");
            factoryInfo.setFactoryProperty(ONSFactoryProperty.PublishTopics, "newtopictest");
            factoryInfo.setFactoryProperty(ONSFactoryProperty.NAMESRV_ADDR, "http://******.mq-internet-access.mq-internet.aliyuncs.com:80");
            factoryInfo.setFactoryProperty(ONSFactoryProperty.LogPath, "E://代碼//示例//消息隊列//阿裡消息MQ//AliMQTest//log//AliSend");



            //// 消息發送
            Producer producer = ONSFactory.getInstance().createProducer(factoryInfo);
            producer.start();

            string myString = "Example message body測試"; //中英文混合字元

            myString = base64tstring.ToBase64String(myString);
            Message msg = new Message(factoryInfo.getPublishTopics(), "tagA", myString);
            msg.setKey(Guid.NewGuid().ToString());
            for (int i = 0; i < 10; i++)
            {
                try
                {
                    try
                    {
                        SendResultONS sendResult = producer.send(msg);

                        Console.WriteLine("send success {0}", sendResult.getMessageId());
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error message: " + ex.Message);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("send failure{0}", ex.ToString());
                }
            }
            producer.shutdown();

            // 建立消費者執行個體
            PushConsumer consumer = ONSFactory.getInstance().createPushConsumer(factoryInfo);

            Console.WriteLine("開始消費消息:");
            // 訂閱 Topics
            consumer.subscribe("newtopictest", "*", new MyMsgListener());
            // 啟動用戶端執行個體
            consumer.start();
            //該設定僅供 demo 使用,實際生産中請保證程序不退出
            Thread.Sleep(300000);

            Console.ReadLine();
        }
    }
}           

測試效果:

MQ消息隊列.NET SDK的使用

參考連結

NET SDK 環境準備 收發普通消息