事件通知

在调用之前、调用之后、出现异常时,会触发 oninvokeonreturnonthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 [1]

服务提供者与消费者共享服务接口

  1. interface IDemoService {
  2. public Person get(int id);
  3. }

服务提供者实现

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

服务提供者配置

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

服务消费者 Callback 接口

  1. interface Notify {
  2. public void onreturn(Person msg, Integer id);
  3. public void onthrow(Throwable ex, Integer id);
  4. }

服务消费者 Callback 实现

  1. class NotifyImpl implements Notify {
  2. public Map<Integer, Person> ret = new HashMap<Integer, Person>();
  3. public Map<Integer, Throwable> errors = new HashMap<Integer, Throwable>();
  4. public void onreturn(Person msg, Integer id) {
  5. System.out.println("onreturn:" + msg);
  6. ret.put(id, msg);
  7. }
  8. public void onthrow(Throwable ex, Integer id) {
  9. errors.put(id, ex);
  10. }
  11. }

服务消费者 Callback 配置

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

callbackasync 功能正交分解,async=true 表示结果是否马上返回,onreturn 表示是否需要回调。

两者叠加存在以下几种组合情况 [2]

  • 异步回调模式:async=true onreturn="xxx"
  • 同步回调模式:async=false onreturn="xxx"
  • 异步无回调 :async=true
  • 同步无回调 :async=false

    测试代码

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

  • 支持版本:2.0.7 之后 ↩︎

  • async=false 默认 ↩︎

原文: http://dubbo.apache.org/#!/docs/user/demos/events-notify.md?lang=zh-cn