除了官网上有这部分的简单介绍外,在别的地方几乎找到真正可行的测试了,这里自己捣鼓一下,已做备忘。
为什么会用到分组聚合呢?有这么一个需求,将配置下发到每个节点,正常的多个服务者,只会调用一个,但我期望的是每一个都被调用,于是分组聚合就排上用场了。
调用多个服务者,肯定也会返回多个返回值,分组聚合的重点也就是在这里,当然如果是void的,更简单,这里说的带返回值的。官方提供两种方式:
1、第一种是执行返回对象里的一个方法,每拿到一个返回值,就调用一次,并将上一次调用结果当作参数传入。配置如下:
<dubbo:reference id="canalAgentService" interface="com.voole.datasync.service.agent.canal.ICanalAgentService" group="*" >
<dubbo:method name="deployCanal" merger=".addAll" />
</dubbo:reference>
注意参数类型必须和返回值类型一致,否则不可用
2、第二种是指定合并器,也就是自己实现一个接口,dubbo将所有返回值一次性全部传递给你,然后你返回一个唯一的值
这种相对比较方便,首先实现
com.alibaba.dubbo.rpc.cluster.Merger
如
public class StatusRetMerger<StatusRet> implements Merger<StatusRet> {
/*
* (非 Javadoc) <p>Title: merge</p> <p>Description: </p>
*
* @param items
*
* @return
*
* @see com.alibaba.dubbo.rpc.cluster.Merger#merge(java.lang.Object[])
*/
@Override
public StatusRet merge(StatusRet... items) {
System.out.println(items);
return null;
}
}
然后在resource下建立/data_sync_admin/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger,注意com.alibaba.dubbo.rpc.cluster.Merger是个文本文件,内容为
statusRet=com.shy.StatusRetMerger
最终在xml配置
<dubbo:reference id="canalAgentService" interface="com.voole.datasync.service.agent.canal.ICanalAgentService" group="*" >
<dubbo:method name="deployCanal" merger="statusRet" />
</dubbo:reference>
最后说一下几个问题
1、分组可以指定某几个组合并
2、方式2中要注意那个文本文件,如果加载不到会出现各种奇怪的错误