导出 (0) 打印
全部展开

步骤 1:简介和先决条件

更新时间: 2015年3月

队列为一个或多个竞争的使用者提供“先进先出 (FIFO)”消息传送方式。也就是说,消息通常按其加入队列的临时顺序由接收者接收和处理,并且每条消息只能由一个消息使用者接收和处理。使用队列的主要优点是实现了应用程序组件的“临时分离”:换句话说,生产者和使用者不需要同时发送和接收消息,因为消息已持久存储在队列中。相关优点是“负载分级”,它允许生产者和使用者以不同速率发送和接收消息。

以下是在开始学习教程前应执行的一些管理步骤和前提步骤。第一步是创建服务命名空间,并获取共享访问签名 (SAS) 密钥。服务命名空间为通过 Service Bus 公开的每个应用程序提供了应用程序边界。创建服务命名空间时,由系统自动生成 SAS 密钥。服务命名空间与 SAS 密钥的组合提供了一个凭据,Service Bus 使用该凭据对应用程序的访问权限进行验证。

  1. 要创建服务命名空间,请执行操作方法:创建或修改 Service Bus 服务命名空间中所述的步骤。

  2. 在 Azure 管理门户的主窗口中,单击在上一步中创建的服务命名空间的名称。

  3. 单击“配置”。

  4. 在“共享访问签名生成器”部分中,记下与“RootManagerSharedAccessKey”策略关联的主密钥,或者将它复制到剪贴板。你将在本教程的后面部分使用此值。

下一步是创建 Visual Studio 项目并编写两个 helper 函数,将用逗号分隔的消息列表加载到强类型 (BrokeredMessage)  List 对象中。

  1. 以管理员身份打开 Visual Studio,方法是在“开始”菜单中右键单击该程序,然后选择“以管理员身份运行”

  2. 创建新的控制台应用程序项目。单击“文件”菜单,选择“新建”,然后单击“项目”。在“新建项目”对话框中,单击“Visual C#”(如果不显示“Visual C#”,则在“其他语言”下方查看),再单击“控制台应用程序”模板,然后将其命名为“QueueSample”。使用默认“位置”。单击“确定”以创建项目。

  3. 使用 NuGet Package Manager 将 Service Bus 库添加到你的项目:

    1. 在“解决方案资源管理器”中,右键单击项目文件夹,然后单击“管理 NuGet 包”。

    2. 在“管理 Nuget 包”对话框中,在线搜索 WindowsAzure.ServiceBus,然后单击“安装”

  4. 在“解决方案资源管理器”中,双击 Program.cs 文件以在 Visual Studio 编辑器中打开它。将命名空间名称从其默认名称 QueueSample 更改为 Microsoft.ServiceBus.Samples

    namespace Microsoft.ServiceBus.Samples
    {
        …
    
  5. 如以下代码段中所示修改 using 语句。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Threading;
    using Microsoft.ServiceBus.Messaging;
    
    
    
    
    
  6. 创建名为 Data.csv 的文本文件,并将以下用逗号分隔的文本复制到该文件中。

    IssueID,IssueTitle,CustomerID,CategoryID,SupportPackage,Priority,Severity,Resolved
    1,Package lost,1,1,Basic,5,1,FALSE
    2,Package damaged,1,1,Basic,5,1,FALSE
    3,Product defective,1,2,Premium,5,2,FALSE
    4,Product damaged,2,2,Premium,5,2,FALSE
    5,Package lost,2,2,Basic,5,2,TRUE
    6,Package lost,3,2,Basic,5,2,FALSE
    7,Package damaged,3,7,Premium,5,3,FALSE
    8,Product defective,3,2,Premium,5,3,FALSE
    9,Product damaged,4,6,Premium,5,3,TRUE
    10,Package lost,4,8,Basic,5,3,FALSE
    11,Package damaged,5,4,Basic,5,4,FALSE
    12,Product defective,5,4,Basic,5,4,FALSE
    13,Package lost,6,8,Basic,5,4,FALSE
    14,Package damaged,6,7,Premium,5,5,FALSE
    15,Product defective,6,2,Premium,5,5,FALSE
    
    

    保存并关闭 Data.csv 文件,然后记住文件保存位置。

  7. 在“解决方案资源管理器”中,右键单击项目名称(在本示例中为“QueueSample”),单击“添加”,然后单击“现有项目”。

  8. 浏览到步骤 6 中创建的 Data.csv 文件。单击该文件,然后单击“添加”。你可能需要确保在文件类型下拉列表中选择了“所有文件 (*.*)”。

  1. Main() 方法前,声明两个变量:一个类型为 DataTable,用于包含 Data.csv 中的消息列表。另一个类型应为 List 对象,强制类型转换为 BrokeredMessage。后者是本教程中后续步骤将要使用的中转消息列表。

    namespace Microsoft.ServiceBus.Samples
    {
        public class Program
        {
    
            private static DataTable issues;
            private static List<BrokeredMessage> MessageList;
    
    
    
  2. Main() 方法外,定义一个 ParseCSV() 方法,用于分析 Data.csv 中的消息列表并将消息加载到表 DataTable 中,如下所示。该方法返回 DataTable 对象。

    static DataTable ParseCSVFile()
    {
        DataTable tableIssues = new DataTable("Issues");
        string path = @"..\..\data.csv";
        try
        {
            using (StreamReader readFile = new StreamReader(path))
            {
                string line;
                string[] row;
    
                // create the columns
                line = readFile.ReadLine();
                foreach (string columnTitle in line.Split(','))
                {
                    tableIssues.Columns.Add(columnTitle);
                }
    
                while ((line = readFile.ReadLine()) != null)
                {
                    row = line.Split(',');
                    tableIssues.Rows.Add(row);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error:" + e.ToString());
        }
    
        return tableIssues;
    }
    
  3. Main() 方法中,添加一个调用 ParseCSVFile() 方法的语句:

    public static void Main(string[] args)
    {
    
        // Populate test data
        issues = ParseCSVFile();
    
    }
    

  1. Main() 方法外,定义一个 GenerateMessages() 方法,该方法可获取 ParseCSVFile() 返回的 DataTable 对象,并将表加载到中转消息的强类型列表中。然后,该方法返回 List 对象。例如:

    static List<BrokeredMessage> GenerateMessages(DataTable issues)
    {
        // Instantiate the brokered list object
        List<BrokeredMessage> result = new List<BrokeredMessage>();
    
        // Iterate through the table and create a brokered message for each row
        foreach (DataRow item in issues.Rows)
        {
            BrokeredMessage message = new BrokeredMessage();
            foreach (DataColumn property in issues.Columns)
            {
                message.Properties.Add(property.ColumnName, item[property]);
            }
            result.Add(message);
        }
        return result;
    }
    
  2. Main() 方法中,直接在 ParseCSVFile() 调用下面添加一个语句,将从 GenerateMessages() 返回的值作为参数调用 ParseCSVFile() 方法:

    public static void Main(string[] args)
    {
    
        // Populate test data
        issues = ParseCSVFile();
        MessageList = GenerateMessages(issues);
    }
    

  1. 首先,创建三个用于保存这些值的全局字符串变量。在以前的变量声明后面直接声明这些变量,例如:

    namespace Microsoft.ServiceBus.Samples
    {
        public class Program
        {
    
            private static DataTable issues;
            private static List<BrokeredMessage> MessageList; 
            // Add these variables
            private static string ServiceNamespace;
            private static string sasKeyName = "RootManageSharedAccessKey";
            private static string sasKeyValue;
            …
    
  2. 接下来,创建一个函数,用于接受并存储服务命名空间和 SAS 密钥。在 Main() 外面添加此方法。例如:

    static void CollectUserInput()
    {
        // User service namespace
        Console.Write("Please enter the service namespace to use: ");
        ServiceNamespace = Console.ReadLine();
    
        // Issuer key
        Console.Write("Please enter the SAS key to use: ");
        sasKeyValue = Console.ReadLine();
    }
    
  3. Main() 方法中,直接在 GenerateMessages() 调用的下面添加调用 CollectUserInput() 方法的语句:

    public static void Main(string[] args)
    {
    
        // Populate test data
        issues = ParseCSVFile();
        MessageList = GenerateMessages(issues);
        
        // Collect user input
        CollectUserInput();
    }
    

编译代码

  • 在Visual Studio的“构建”菜单中,选择“构建解决方案”或,或按 F6 确认目前所做工作的准确性。

显示:
© 2015 Microsoft