duubo分组聚合

除了官网上有这部分的简单介绍外,在别的地方几乎找到真正可行的测试了,这里自己捣鼓一下,已做备忘。

为什么会用到分组聚合呢?有这么一个需求,将配置下发到每个节点,正常的多个服务者,只会调用一个,但我期望的是每一个都被调用,于是分组聚合就排上用场了。

调用多个服务者,肯定也会返回多个返回值,分组聚合的重点也就是在这里,当然如果是void的,更简单,这里说的带返回值的。官方提供两种方式:

    1、第一种是执行返回对象里的一个方法,每拿到一个返回值,就调用一次,并将上一次调用结果当作参数传入。配置如下:

<dubbo:reference id="canalAgentService" interface="com.voole.datasync.service.agent.canal.ICanalAgentService" group="*" >
		<dubbo:method name="deployCanal" merger=".addAll" />
	</dubbo:reference>

141157_xlMw_2358114.png

注意参数类型必须和返回值类型一致,否则不可用

    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中要注意那个文本文件,如果加载不到会出现各种奇怪的错误

转载于:https://my.oschina.net/shyloveliyi/blog/1518072

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值