在消息队列上下文中,队列是不同类型消息的临时存储位置。队列可以由下列项创建:

  • 应用程序

  • 管理员

  • 消息队列

应用程序或管理员创建的队列称作应用程序队列。消息队列创建的队列称作系统队列

应用程序队列

消息队列所包含应用程序队列的类型如下:

公用队列和专用队列

公用队列

在域环境中,公用队列是在 Active Directory 域服务 (AD DS) 中发布的队列,因此在林中是重复的。只有这些队列的属性是重复的,而不是实际的队列本身或其内容。如果用户具有访问适用队列对象的足够权限,则林中的任何计算机都可能访问有关公用队列的信息。一般而言,林中具有 AD DS 访问权限和给定公用队列的“发送消息”权限的任何用户都可以向其发送消息。默认情况下,创建队列时已授予此权限。若要读取公用队列中的消息,您必须具有该队列的“扫视消息”权限或“接收消息”权限。

在 AD DS 环境中,定义公用队列确保将队列注册到目录服务中,并且已备份其注册。它们是永久性的队列,且可用于其他应用程序。

专用队列

专用队列是未在 AD DS 中发布的队列。专用队列只会在包含其的本地计算机上显示。专用队列具有无目录服务开销的优势,从而使队列:

  • 创建更快速。

  • 进行访问时没有延迟。

  • 没有重复的开销。

在工作组环境中,只有专用队列可用。

本地计算机上的消息队列应用程序若要访问专用队列,该应用程序只需知道队列的路径即可。对于远程计算机上的消息队列应用程序,应用程序需要直接或专用格式名称以访问此类队列。若要读取队列的消息,远程消息队列应用程序需要该队列的“接收消息”权限。默认情况下,每个人都具有向公用队列和专用队列发送消息的权限。

事务性队列和非事务性队列

事务性队列是一种只包含事务性消息(在事务中发送的消息)的队列。发送和接收消息的要求取决于所使用队列的类型(事务性或非事务性)和队列的位置(本地或远程)。

发送消息

使用事务发送消息时,可以将消息发送到任何事务性队列,而不管队列的位置如何,但事务性队列只能接受在事务上下文中发送的消息。同样,非事务性队列只能接受在事务上下文以外发送的消息。

接收消息

可以接收本地队列或远程队列中的消息。

子队列

子队列使应用程序可以对消息进行分组。在下列情形中子队列很有用:

  • 工作订单处理。如果应用程序处理的消息包含各种工作订单中的项,它可以使用子队列按工作订单分组行项,以便更高效地进行处理。

  • 有害消息处理。如果应用程序接收到的消息无法在当时进行处理,它可以将消息移动到错误子队列以在以后进行处理。

打开此类消息时会隐式创建子队列。换句话说,将消息移动到子队列时,此操作必然创建一个子队列(如果尚不存在子队列)。当子队列为空时将被删除,并且它们没有打开的句柄。应用程序无法直接将消息发送到子队列。它们只能将消息移动到子队列。它们可以接收子队列中的消息,在主队列及其子队列之间移动消息或在同一主队列的子队列之间移动消息。它们无法将主队列的子队列中的消息移动到其他主队列的子队列。

例如,在下图中,可以在 subqueue1(或 subqueue2)和 queuea 的队列消息文件夹之间来回移动消息。还可以在 subqueue1 和 subqueue2 之间移动消息。同样,可以在 queuez 及其子队列之间,subqueue3 和 subqueue4 之间来回移动消息。

但是,无法在 queuea 和 subqueue3(或 subqueue4)或者 queuez 和 subqueue1(或 subqueue2)之间移动消息。同样,无法在 queuea 的子队列(subqueue1 或 subqueue2)和 queuez 的子队列(subqueue3 或 subqueue4)之间来回移动消息。

子队列

子队列不具有其自身的属性或状态。它们共享主队列的属性。例如,子队列不具有其自身的以下内容:

  • 配额

  • 访问控制列表 (ACL)

  • 事务性类型

子队列共享主队列的配额,子队列中的消息包含在该配额中。

子队列无法在日志或其他系统队列或者其他子队列下创建。

管理队列

管理队列是应用程序生成的队列。这些队列用于存储系统生成的由消息队列或连接器应用程序创建的否定和肯定确认消息。它们由发送应用程序以编程方式在初始消息中指定。任何可用的非事务性队列都可以指定为管理队列。管理队列不包含存储在内部专用队列中的管理消息。

返回到这些队列的系统生成的确认消息可以表明消息是否到达其目标队列、是否从目标队列中检索到它,或者同时表明两种情况。每条确认消息都包含描述触发确认的内容以及确认所指的消息的信息。请求确认消息时,发送应用程序必须指定要用作管理队列的队列以及消息的确认级别。通常,管理队列是本地队列,以便发送应用程序可以本地读取确认消息。

响应队列

与管理队列相似,响应队列是应用程序生成的。它们用于存储应用程序生成的响应消息,这些响应消息通常由从队列读取消息的应用程序返回。响应队列由发送应用程序在消息发送时以编程方式指定。任何可用的队列都可以指定为响应队列。响应消息与管理响应消息不同,管理响应消息存储在内部专用队列中。

返回响应消息的应用程序和读取响应消息的应用程序必须理解返回到这些队列的响应消息。消息队列无法控制在响应消息中发送何种信息。请求响应消息时,发送应用程序必须指定它要用作响应队列的队列。通常,响应队列是本地队列,以便发送应用程序可以本地读取响应消息。

同时需要响应队列和管理队列时,可以将它们的功能合并到一个队列中。但是,由于所有管理队列必须是非事务性的,此队列将只接受非事务性消息。

报告队列

报告队列是应用程序生成的队列,用于存储消息队列或连接器应用程序在发送应用程序请求跟踪时生成的报告消息。报告消息表明消息对其远程计算机上的目标执行的路由,或测试消息对远程计算机上的测试队列执行的路由。每台计算机只能有一个报告队列。

所有报告队列都必须具有下列标签和队列类型标识符。

  • 标签:MQReport 队列

  • 队列类型标识符。

    {55EE8F32-CCE9-11CF-B108-0020AFD61CE9}

消息队列管理员通常通过使用 Active Directory 用户和计算机创建报告队列。但是,如果创建队列时,已指定正确的标签和队列类型标识符,应用程序也可以生成报告队列。发送报告消息时,消息队列使用标签和队列类型标识符查找和打开适当队列。

系统队列

消息队列创建系统队列。应用程序可以读取系统队列中的消息,但无法为其寻址消息。消息队列提供不同类型的系统队列,包括:

  • 日志队列,其中包含从队列删除的所有消息的副本。计算机日志包含从计算机发送的所有消息的副本。

  • 内部专用队列,用作用于存储和转发传送给目标队列的消息的内部队列。这些队列未在 AD DS 中发布。传出队列是本地内部专用队列,自动生成以存储发送到远程队列的消息。

  • 死信队列,其中包含无法传递的消息。消息队列提供事务性死信队列和非事务性死信队列。

  • 连接器队列,用于跨平台的消息传递。

  • 传出队列是本地内部队列,用于存储发送到远程队列的消息。可以在脱机情况下将消息存储在传出队列中,然后在重现建立连接时将其发送到远程计算机上的目标队列。这些队列是自动生成的,因此无法手动创建或删除。

根据需要执行下列过程以管理队列:


目录