客户端连接到代理之后,即可开始路由和传送消息。在该阶段,代理负责创建和管理不同类型的物理目的地、确保消息顺利流动以及高效使用资源。代理使用与路由和目的地有关的代理属性,按照符合应用程序需要的方式来管理这些任务。
请记住,代理的物理目的地是一个内存位置,消息在传送到消息使用方之前存储在该位置。物理目的地分为四种:
管理员创建的目的地,由管理员使用 GUI (imqadmin) 或 imqcmd 实用程序创建。这些目的地对应于以编程方式创建的逻辑目的地,或者对应于由管理员创建、由客户端查找的目的地受管理对象。可以使用 imqcmd 实用程序来为管理员创建的每个目的地设置或更新属性。
自动创建的目的地,当消息使用方或生成方尝试访问不存在的目的地时,由代理自动创建的目的地。这些目的地通常在开发过程中使用。可以设置用来禁止创建此类目的地的代理属性。可以设置用来配置特定代理中所有自动创建的目的地的代理属性。
当自动创建的目的地不再使用时,也就是当它不再与任何消息使用方客户端连接且不再包含任何消息时,代理会自动将它销毁。如果代理重新启动,则只有当它包含持久性消息时,才会重新创建这种目的地。
临时目的地,由需要一个用来接收消息回复的目的地的客户端以编程方式显式创建和销毁。顾名思义,这些目的地是为连接临时创建的,并由代理维护,而且仅在连接期间存在。
临时目的地不永久存储,并且绝不会在代理重新启动时重新创建,但是它们对于管理工具是可见的。
停用消息队列是一种在代理启动时自动创建的专用目的地,用于存储停用消息,以便于进行诊断。可以使用 imqcmd 实用程序为停用消息队列设置属性。
可以使用 imqcmd 实用程序来管理目的地。要管理目的地,需要完成下面的一个或多个任务:
创建、暂停、继续或销毁目的地
列出代理中的所有目的地
显示有关目的地的状态和属性的信息
显示目的地的度量信息
压缩用于持久保留目的地消息的磁盘空间
更新物理目的地的属性
管理任务因所管理的目的地的种类(管理员创建、自动创建、临时或停用消息队列)而异。例如,临时目的地不需要显式销毁;自动创建的属性可通过使用某些代理配置属性来配置,这些属性应用于该代理中自动创建的所有目的地。
为了获得最佳性能,您可以在创建或更新物理目的地时设置属性。下面是可以设置的属性:
目的地的类型和名称。
目的地的单个和合计限制(消息的最大数量、最大总字节数、每条消息的最大字节数以及生成方的最大数量)。
在超过单个或合计限制时,代理应当执行的操作。
要在一批中传送的消息的最大数量。
是否应将目的地的停用消息发送到停用消息队列。
对于群集代理,是否应当将目的地复制到群集内的其他代理。
对于队列目的地,还可以配置备份使用方的最大数量,并为群集代理指定是否优先传送到本地队列。
还可以配置停用消息队列的限制和行为。但是,请注意,停用消息队列的默认属性不同于标准队列的属性。
因为目的地可能使用大量的资源(取决于它们处理的消息的数量和大小以及注册的使用方数量和长期性),所以需要对它们进行严格的管理,以保证消息传送服务具有良好的性能和可靠性。
可以设置一些属性,以防止向代理传入过多的消息并防止代理内存不足。代理使用以下三级内存保护,使消息服务在资源不足时仍可正常运行:目的地限制、系统范围限制以及系统内存阈值。理想情况下,如果目的地限制和系统范围限制设置得当,则应当不会达到紧急系统内存阈值。
可以设置用来管理每个目的地的内存和消息流的目的地属性。例如,可指定目的地允许的生成方的最大数量、目的地允许的消息的最大数量或最大大小以及任何一条消息的最大大小。
还可以指定在达到上述任何限制时代理的响应方式:降低生成方的速度、丢弃最旧的消息、丢弃优先级最低的消息或者拒绝最新的消息。
还可以使用属性来设置应用于代理中所有目的地的限制:可以指定消息总数和所有消息占用的内存。如果达到了任何系统范围消息限制,代理将拒绝新消息。
最后,可以使用属性来设置阈值。当达到阈值时,代理会采取越来越严格的措施来防止内存过载。采取的操作取决于内存资源的状态:green(可用内存充足)、yellow(代理内存不足)、orange(代理内存严重不足)、red(代理无可用内存)。随着代理的内存状态从 green 变为 red,代理所采取的措施也会越来越严格:
它丢弃持久性消息在数据存储库中的内存副本。
它限制生成方的非持久性消息,最终会停止进入代理的消息流。持久性消息流自动受以下要求的限制:每条消息必须由代理确认。