zoukankan      html  css  js  c++  java
  • 事件通知 oninvoker、onreturn、onthrow

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

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

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

    服务提供者实现

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

    服务提供者配置

    <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"/>

    服务消费者 Callback 接口

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

    服务消费者 Callback 实现

    class NotifyImpl implements Notify {
        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);
        }
    }

    服务消费者 Callback 配置

    <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

    测试代码

    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());
  • 相关阅读:
    BZOJ_3171_[Tjoi2013]循环格_最小费用最大流
    BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心
    BZOJ_1576_[Usaco2009 Jan]安全路经Travel&&BZOJ_3694_最短路_树链剖分+线段树
    BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数
    BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho
    BZOJ_1584_[Usaco2009 Mar]Cleaning Up 打扫卫生_DP
    BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心
    BZOJ_2160_拉拉队排练_manacher
    [转载]Linux软件包及dpkgapt等方法
    服务器基础认知杂谈及一小点运维相关
  • 原文地址:https://www.cnblogs.com/yifanSJ/p/9187989.html
Copyright © 2011-2022 走看看