演练:创建队列和使用消息

更新:2007 年 11 月

本主题中的过程演示使用 MessageQueue 组件创建消息队列的过程。通过使用该组件,可以向队列发送消息并在队列中检索消息。该消息记录帮助请求。

说明:

若要在“服务器资源管理器”中查看队列信息或以编程方式访问队列,必须在客户端计算机上安装“消息队列”Windows 组件。若要添加此服务,请使用“控制面板”中的“添加或删除程序”。

说明:

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置

在您的计算机上创建消息队列

  1. 在“文件”菜单上指向“新建”,然后单击“项目”。

  2. 在“新建项目”对话框中,创建 Visual Basic 或 Visual C# 的“Windows 应用程序”。将其命名为 MessageQ。

  3. 打开“服务器资源管理器”。有关更多信息,请参见 如何:访问和初始化服务器资源管理器/数据库资源管理器

  4. 展开“服务器”节点。

  5. 展开本地服务器的节点。按计算机名识别本地服务器的节点。

  6. 展开“消息队列”节点。

  7. 右击“专用队列”,然后单击创建队列。

  8. 为该队列名称输入 HelpRequest。不要选中“使队列具有事务性”。

  9. 一个名为“HelpRequest”的新专用队列被创建并出现在“服务器资源管理器”中。

    说明:

    您还可以通过“我的电脑”图标查看新创建的队列。右击桌面上的“我的电脑”图标,然后单击“管理”。展开“服务和应用程序”节点。展开“消息队列”节点并选择“专用队列”文件夹。新队列出现在队列列表中。

为您的消息队列添加 MessageQueue 组件

  1. 将 HelpRequest 队列从“服务器资源管理器”拖到窗体上。为“HelpRequest”队列配置的新 MessageQueue 组件将添加到项目中。

    MessageQueue 组件用于以编程方式访问在上一节中创建的“HelpRequest”队列中所包含的消息。

  2. MessageQueue 组件的“(Name)”属性设置为 helpRequestQueue。

  3. 在“属性”窗口中,展开 MessageReadPropertyFilter 节点。将“Priority”的值设置为 true。这样,当从队列中检索消息时,同时会检索消息的优先级。

    您在下一个步骤中创建的用户界面允许用户输入一些帮助请求文本并设置消息的优先级。用户单击“发送”按钮将请求发送到队列。一个 DataGridView 控件显示队列的内容。用户界面还包含用队列的当前内容更新网格的按钮和清除队列的按钮。

创建用户界面

  1. 在“工具箱”的“Windows 窗体”选项卡中,将以下控件添加到 Form1:

  2. 设置以下控件属性:

    控件

    属性

    新值

    Label1

    Text

    名称

    Label2

    Text

    消息

    TextBox1

    Name

    txtName

     

    Text

    (空白)

    TextBox2

    Name

    txtMessage

     

    Text

    (空白)

     

    Multiline

    true

    Button1

    Name

    sendMessage

     

    Text

    发送消息

    Button2

    Name

    refreshMessages

     

    Text

    刷新消息列表

    Button3

    Name

    purgeMessages

     

    Text

    清除消息列表

    CheckBox1

    Name

    highPriority

     

    Text

    高优先级

    DataGridView1

    Name

    messageGrid

  3. 整齐地排列控件。

向队列发送消息

  1. 在设计器中,双击 sendMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。

  2. 在方法中添加代码以创建新的 Message 实例并将其发送到队列,并更新消息显示。下一步中将编写 DisplayMessages 方法。

    Private Sub sendMessage_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles sendMessage.Click
       Dim theMessage As System.Messaging.Message = _
          New System.Messaging.Message(Me.txtMessage.Text)
       theMessage.Label = Me.txtName.Text
       If highPriority.Checked Then
          theMessage.Priority = Messaging.MessagePriority.Highest
       Else
          theMessage.Priority = Messaging.MessagePriority.Normal
       End If
       helpRequestQueue.Send(theMessage)
       DisplayMessages()
    End Sub
    
    private void sendMessage_Click(object sender, System.EventArgs e)
    {
       System.Messaging.Message theMessage = 
          new System.Messaging.Message(txtMessage.Text);
       theMessage.Label = txtName.Text; 
       if (highPriority.Checked)
          theMessage.Priority = System.Messaging.MessagePriority.Highest;
       else
          theMessage.Priority = System.Messaging.MessagePriority.Normal;
       helpRequestQueue.Send(theMessage);
       DisplayMessages();
    }
    
  3. 向项目添加 System.Data 引用。为 System.Data 添加 Imports 语句(.NET 命名空间和类型) (Visual Basic) 或 using(C# 参考) 语句。有关更多信息,请参见管理引用如何:在 Visual Studio 中添加或移除引用 (Visual Basic)

  4. 添加方法以在 DataGridView 控件中显示队列的内容。该方法使用 MessageQueue.GetAllMessages 方法来检索队列中的所有消息。将选定的队列属性添加到 DataTable 对象,该对象用作 DataGridView 控件的数据源。若要检索消息的文本,您必须为消息创建格式化程序。

    Private Sub DisplayMessages()
       ' Create a DataTable
       Dim messageTable As New DataTable()
       messageTable.Columns.Add("Name")
       messageTable.Columns.Add("Message")
       messageTable.Columns.Add("Priority")
       Dim messages() As System.Messaging.Message
       messages = helpRequestQueue.GetAllMessages()
       ' Need a formatter to get the text of the message body.
       Dim stringFormatter As System.Messaging.XmlMessageFormatter = _
          New System.Messaging.XmlMessageFormatter(New String() _
          {"System.String"})
       Dim index As Integer
       Dim am As System.Messaging.Message
       ' Add each message to the DataTable
       For index = 0 To messages.Length - 1
          messages(index).Formatter = stringFormatter
          am = messages(index)
          messageTable.Rows.Add(New String() _
             {am.Label, am.Body.ToString(), am.Priority.ToString()})
       Next
    
       messageGrid.DataSource = messageTable
    End Sub
    
    private void DisplayMessages()
    {
       DataTable messageTable = new DataTable();
       messageTable.Columns.Add("Name");
       messageTable.Columns.Add("Message");
       messageTable.Columns.Add("Priority");
       System.Messaging.Message[] messages;
       messages = helpRequestQueue.GetAllMessages();
       System.Messaging.XmlMessageFormatter stringFormatter;
       stringFormatter = new System.Messaging.XmlMessageFormatter(
          new string[] {"System.String"});
       for (int index = 0; index < messages.Length; index++) 
       {
          messages[index].Formatter = stringFormatter;
          messageTable.Rows.Add(new string[] {
             messages[index].Label,
             messages[index].Body.ToString(),
             messages[index].Priority.ToString() });
       }
       messageGrid.DataSource = messageTable;
    

    }

显示队列的内容

  1. 在设计器中,双击 refreshMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。

  2. 在 Click 事件处理程序中调用 DisplayMessages 方法。

    Private Sub refreshMessages_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles refreshMessages.Click
       DisplayMessages()
    End Sub
    
    private void refreshMessages_Click(object sender, System.EventArgs e)
    {
       DisplayMessages();
    

    }

清除队列的内容

  1. 在设计器中,双击 purgeMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。

  2. 调用 helpRequestQueue 的 Purge 方法,然后刷新 DataGridView 控件的内容。

    Private Sub purgeMessages_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles purgeMessages.Click
       helpRequestQueue.Purge()
       DisplayMessages()
    End Sub
    
    private void purgeMessages_Click(object sender, System.EventArgs e)
    {
       helpRequestQueue.Purge();
       DisplayMessages();
    

    }

测试应用程序

  1. 按 F5 运行应用程序。

  2. 键入名称和短消息。

  3. 单击“发送消息”将消息发送到队列并更新显示。

  4. 单击“清除消息”以删除队列中的所有消息。消息列表将为空。

请参见

任务

如何:创建队列

如何:创建 MessageQueue 组件实例

如何:发送简单消息

如何:检索消息

概念

消息处理介绍

其他资源

使用消息组件