在 Message Queue 4.2 中,发布者现在可以将消息发布到多个主题目的地;订阅者可以使用多个主题目的地中的消息。此功能是通过使用包含通配符的主题目的地名称(表示多个目的地)来实现的。通过使用此类符号名称,管理员可以根据需要创建与通配符命名方案保持一致的其他主题目的地。发布者可自动将消息发布到所添加的目的地,订阅者可自动使用其中的消息。(通配符主题订阅者比发布者更常见。)
此功能不适用于队列目的地。
符号主题目的地名称的格式包含多个段,其中通配符(*、 ** 和 >)可以表示名称中的一个或多个段。例如,假定主题目的地命名方案如下所示:
size.color.shape
其中,主题名称段可以具有以下值:
size:large、medium、small ...
color:red、green、blue ...
shape:circle、triangle、square ...
Message Queue 支持以下通配符:
* 与单个段匹配
** 与一个或多个段匹配
> 与任意数量的连续段匹配
因此,可以采用以下方式表示多个主题目的地:
large.*.circle 表示:
large.red.circle large.green.circle ...
**.square 表示以 .square 结尾的所有名称,例如:
small.green.square medium.blue.square ... |
small.> 表示以 small. 开头的所有目的地名称,例如:
small.blue.circle small.red.square ... |
要使用此多目的地功能,请采用与上述类似的命名方案创建主题目的地。之后,客户端应用程序便可使用符号目的地名称创建发布者或使用方。例如:
... String DEST_LOOKUP_NAME = "large.*.circle"; Topic t = (Destination) ctx.lookup(DEST_LOOKUP_NAME); TopicPublisher myPublisher = mySession.createPublisher(t) myPublisher.send(myMessage);
... String DEST_LOOKUP_NAME = "**.square"; Topic t = (Destination) ctx.lookup(DEST_LOOKUP_NAME); TopicSubscriber mySubscriber = mySession.createSubscriber(t); Message m = mySubscriber.receive();
在第一个示例中,代理将消息副本放在与符号名称 large.*.circle 匹配的所有目的地中。在第二个示例中,如果至少有一个目的地与符号名称 **.square 匹配,则会创建一个订阅者,它将从与该符号名称匹配的所有目的地中接收消息。如果没有与该符号名称匹配的目的地,则在此类目的地出现后,才会创建订阅者。
如果管理员创建与某个符号名称匹配的其他目的地,则使用此符号名称创建的通配符发布者随后会将消息发布到该目的地,使用此符号名称创建的通配符订阅者随后将从该目的地中接收消息。
此外,Message Queue 管理工具除了报告主题目的地的发布者(生成方)和订阅者(使用方) 总数外,还会报告通配符发布者(包括对应的符号目的地名称)和通配符订阅者(包括对应的符号目的地名称)数(如果有)。