8.15. scatter-Gather
scatter-Gather 复制链接链接已复制到粘贴板!
scatter-gather 模式 (如 图 8.11 “scatter-Gather Pattern” 所示)可让您将信息路由到多个动态指定的接收方,并将响应重新整理回单个消息。
图 8.11. scatter-Gather Pattern
动态 scatter-gather 示例 复制链接链接已复制到粘贴板!
以下示例概述了从多个不同供应商获得最佳引用的应用程序。这个示例使用动态 第 8.3 节 “接收者列表” 来请求来自所有供应商和 第 8.5 节 “聚合器” 的引用,以选择出所有响应的最佳引用。此应用程序的路由定义如下:
在第一个路由中,第 8.3 节 “接收者列表” 查看 listOfVendors
标头来获取接收者列表。因此,向此应用发送消息的客户端需要向消息中添加 listOfVendors
标头。例 8.1 “消息传递客户端示例” 显示消息传递客户端的一些示例代码,这些代码将相关的标头数据添加到传出消息。
例 8.1. 消息传递客户端示例
Map<String, Object> headers = new HashMap<String, Object>(); headers.put("listOfVendors", "bean:vendor1, bean:vendor2, bean:vendor3"); headers.put("quoteRequestId", "quoteRequest-1"); template.sendBodyAndHeaders("direct:start", "<quote_request item=\"beer\"/>", headers);
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("listOfVendors", "bean:vendor1, bean:vendor2, bean:vendor3");
headers.put("quoteRequestId", "quoteRequest-1");
template.sendBodyAndHeaders("direct:start", "<quote_request item=\"beer\"/>", headers);
该消息将分发到以下端点: bean:vendor1、
bean:vendor2
和 bean:vendor3
。这些 Bean 都由以下类实现:
bean 实例、vendor1、
vendor2
和 vendor3
使用 Spring XML 语法进行实例化,如下所示:
每个 bean 都使用不同价格进行初始化(传递给构造器参数)。当消息发送到每个 bean 端点时,它会到达 MyVendor.getQuote
方法。这个方法进行简单的检查来查看此引用请求是否为 beer,然后设置交换上的价格,以便稍后进行检索。使用 POJO Producing 将消息转发到下一步(请参阅 @Produce 注释)。
下一步,我们希望从所有供应商处获取 beer quotes,并找出哪个是最佳(即最低)。为此,我们使用带有自定义聚合策略的 第 8.5 节 “聚合器”。第 8.5 节 “聚合器” 需要识别与当前引用相关的消息,这通过根据 quoteRequestId
标头的值(传递至 correlationExpression
)来修正消息。如 例 8.1 “消息传递客户端示例” 所示,关联 ID 设置为 quoteRequest-1 (
关联 ID 应该是唯一的)。要选择集合中的最低引用,您可以使用自定义聚合策略,如下所示:
静态 scatter-gather 示例 复制链接链接已复制到粘贴板!
您可以使用静态 第 8.3 节 “接收者列表” 在 scatter-gather 应用程序中明确指定接收者。以下示例显示了您要用来实现静态 scatter-gather 场景的路由: