Dubbo事件通知

原文地址:http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-事件通知

事件通知


在调用之前,调用之后,出现异常时,会触发oninvoke, onreturn, onthrow三个事件,可以配置当事件发生时,通知哪个类的哪个方法。
支持版本:2.0.7之后

(1) 服务提供者与消费者共享服务接口:

interface IDemoService {
    public Person get(int id);
}

(2) 服务提供者实现:

class NormalDemoService implements IDemoService {
    public Person get(int id) {
        return new Person(id, "charles`son",4);
    }
}

(3) 服务提供者配置:

provider.xml

<dubbo:application name="rpc-callback-demo"/>
<dubbo:registry address="http://10.20.160.198/wiki/display/dubbo/10.20.153.186"/>
<bean id="demoService" class="com.alibaba.dubbo.callback.implicit.NormalDemoService"/>
<dubbo:service interface="com.alibaba.dubbo.callback.implicit.IDemoService"ref="demoService" version="1.0.0"group="cn"/>

(4) 服务消费者Callback接口及实现:


interface Nofify {
    public void onreturn(Person msg, Integer id);
    public void onthrow(Throwable ex, Integer id);
}


class NofifyImpl implements Nofify {
    public Map<Integer, Person>    ret    = new HashMap<Integer, Person>();
    public Map<Integer, Throwable> errors = new HashMap<Integer, Throwable>();
    public void onreturn(Person msg, Integer id) {
        System.out.println("onreturn:" + msg);
        ret.put(id, msg);
    }
    public void onthrow(Throwable ex, Integer id) {
        errors.put(id, ex);
    }
}

(5) 服务消费者Callback接口及实现:

consumer.xml

<bean id="demoCallback"class= "com.alibaba.dubbo.callback.implicit.NofifyImpl"/>
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.callback.implicit.IDemoService" version="1.0.0" group="cn">
  <dubbo:method name="get" async="true" onreturn= "demoCallback.onreturn" onthrow="demoCallback.onthrow"/>
</dubbo:reference>

注:
callback与async功能正交分解:
async=true,表示结果是否马上返回.
onreturn 表示是否需要回调.

组合情况:(async=false 默认)
异步回调模式:async=true onreturn="xxx"
同步回调模式:async=false onreturn="xxx"
异步无回调 :async=true
同步无回调 :async=false

(6) TEST CASE:

IDemoService demoService = (IDemoService) context.getBean("demoService");
NofifyImpl notify = (NofifyImpl) context.getBean("demoCallback");
int requestId = 2;
Person ret = demoService.get(requestId);
Assert.assertEquals(null, ret);
//for Test:只是用来说明callback正常被调用,业务具体实现自行决定.
for(int i = 0; i < 10; i++) {
    if(!notify.ret.containsKey(requestId)) {
        Thread.sleep(200);
    }else{
        break;
    }
}
Assert.assertEquals(requestId, notify.ret.get(requestId).getId());

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值