• 参数回调 callbacks


    效果:Consumer调用Provider方法,在Provider方法中回调Consumer提供的方法。

    参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。

    服务接口示例

    CallbackService.java

    public interface CallbackService {
        void addListener(String key, CallbackListener listener);
    }

    CallbackListener.java

    public interface CallbackListener {
        void changed(String msg);
    }

    服务提供者接口实现示例

    public class CallbackServiceImpl implements CallbackService{
        private final Map<String, CallbackListener> listeners = new ConcurrentHashMap<String, CallbackListener>();
        
        public CallbackServiceImpl() {
            Thread t = new Thread(new Runnable() {
                public void run() {
                    while(true) {
                        try {
                            for(Map.Entry<String, CallbackListener> entry : listeners.entrySet()){
                               try {
                                   entry.getValue().changed(getChanged(entry.getKey()));
                               } catch (Throwable t) {
                                   listeners.remove(entry.getKey());
                               }
                            }
                            Thread.sleep(5000); // 定时触发变更通知
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            t.setDaemon(true);
            t.start();
        }
        
        public void addListener(String key, CallbackListener listener) {
            listeners.put(key, listener);
            listener.changed(getChanged(key)); // 发送变更通知
        }
    
        private String getChanged(String key) {
            return "Changed: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        }
    }

    服务提供者配置示例

    <bean id="callbackService" class="com.ssmp.serviceImpl.CallbackServiceImpl" />
    <dubbo:service interface="com.ssmp.service.CallbackService" ref="callbackService" connections="1" callbacks="1000">
        <dubbo:method name="addListener">
            <dubbo:argument index="1" callback="true" />
            <!--也可以通过指定类型的方式-->
            <!--<dubbo:argument type="com.demo.CallbackListener" callback="true" />-->
        </dubbo:method>
    </dubbo:service>

    服务消费者配置示例

    <dubbo:reference id="callbackService" interface="com.ssmp.service.CallbackService" />

    服务消费者调用示例

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/spring/user-consumer.xml");
    context.start();
    
    CallbackService callbackService = (CallbackService) context.getBean("callbackService");
    callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){
        public void changed(String msg) {
            System.out.println("callback1:" + msg);
        }
    });
    System.in.read();
  • 相关阅读:
    mysql导sql脚本
    oracle导sql脚本
    基于jdk proxy的动态代理模式
    vue组件之组件的生命周期
    vue组件之组件间的通信
    python-爬虫scrapy框架安装及基本使用
    mongdb的使用
    python-爬虫 多线程爬虫
    python-爬虫 爬虫利器BeautifulSoup
    python-爬虫lxml库
  • 原文地址:https://www.cnblogs.com/yifanSJ/p/9186250.html
Copyright © 2020-2023  润新知