? ? ? ? 参数回调实现了在客户端调用服务时,将回调方法做为参数传递给服务端。当服务端提供服务时会调用执行客户回调方法,从而执行客户端自定义的一些操作。
以下为具体实现方式:
服务端服务接口
public interface CallbackService { void addListener(String key, CallbackListener listener); }
?
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 (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()); } }
?服务端配置
<bean id="callbackService" class="com.callback.impl.CallbackServiceImpl" />
<dubbo:service interface="com.callback.CallbackService" ref="callbackService" connections="1" callbacks="1000" protocol="dubbo">
<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.callback.CallbackService" />
?服务消费端调用
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); } });
?执行结果
callback1:Changed: 2016-06-17 14:15:05 callback2:Changed: 2016-06-17 14:15:05 callback2:Changed: 2016-06-17 14:15:06 callback1:Changed: 2016-06-17 14:15:06 callback2:Changed: 2016-06-17 14:15:11
?
?
原文:http://beichen35.iteye.com/blog/2305713