dubbo之callback

dubbo之callback,第1张

dubbo之callback 1:写在前面

考虑这样的场景,当消费者调用服务提供者后,服务提供者需要执行一段时间,比如一分钟左右,才能有结果,这时就有2种方案,一种是同步方案,即等着,第二种是异步方案,有结果之后让服务提供者回调消费者的一个接口,显然同步的方案肯定是不行的,线程资源可能在很短的时间内就会耗尽,因此第二种明显是最优方案,针对这种场景,dubbo提供了callback机制,下面我们来一起看下。

2:服务提供者 2.1:服务接口
public interface MyCallbackService {
    void addListener(String key, CallbackListener listener);
}
2.2:回调接口

消费者实现该接口提供回调实现类,提供者调用回调实现类执行回调 *** 作。

public interface CallbackListener {
    void changed(String msg);
}
2.3:服务实现类
public class CallbackServiceImpl implements MyCallbackService {
     
    private final Map listeners = new ConcurrentHashMap();
  
    public CallbackServiceImpl() {
        // 定时触发变更
        Thread t = new Thread(new Runnable() {
            public void run() {
                while(true) {
                    try {
                        for(Map.Entry entry : listeners.entrySet()){
                           try {
                               entry.getValue().changed(getChanged(entry.getKey()));
                           } catch (Throwable t) {
                               listeners.remove(entry.getKey());
                           }
                        }
                        Thread.sleep(5000); // 定时触发变更通知
                    } catch (Throwable t) { // 防御容错
                        t.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());
    }
}
2.4:xml



    
    
    
    
    
    
    
        
            
            
            
            
        
    

2.5:main
public class ProviderWithCallbackMain {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext ac
                = new ClassPathXmlApplicationContext("meta-INF/spring/provider-with-call.xml");
        ac.start();
        System.in.read(); // 按任意键退出
    }
}
3:服务消费者 3.1:xml



    
    
    
    
    

3.2:main
public class ConsumerWithCallbackMain {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context
                = new ClassPathXmlApplicationContext("consumer-with-callback.xml");
        context.start();
        MyCallbackService callbackService = (MyCallbackService) context.getBean("callbackService");

        callbackService.addListener("foo.bar", new CallbackListener(){
            public void changed(String msg) {
                System.out.println("callback1:" + msg);
            }
        });

        System.in.read();
    }
}
3.3:启动测试

假定服务提供者已经启动成功。

...
callback1:Changed: 2021-11-30 13:39:58
callback1:Changed: 2021-11-30 13:39:58
callback1:Changed: 2021-11-30 13:40:03
callback1:Changed: 2021-11-30 13:40:08

可以看到每5秒钟就会被调用一次。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5638542.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存