参数回调
![]() | 参数回调方式与调用本地callback或listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,Dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。 |
![]() | 2.0.6及其以上版本支持 |
(1) 共享服务接口:
服务接口示例:
CallbackService.java
package com.callback; public interface CallbackService { void addListener(String key, CallbackListener listener); } |
CallbackListener.java
package com.callback; public interface CallbackListener { void changed(String msg); } |
(2) 服务提供者:
服务提供者接口实现示例:
CallbackServiceImpl.java
package com.callback.impl; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.callback.CallbackListener; import com.callback.CallbackService; 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" > < dubbo:method name = "addListener" > < dubbo:argument index = "1" callback = "true" /> <!--也可以通过指定类型的方式--> <!--<dubbo:argument type="com.demo.CallbackListener" callback="true" />--> </ dubbo:method > </ dubbo:service > |
(2) 服务消费者:
服务消费者配置示例:
consumer.xml
< dubbo:reference id = "callbackService" interface = "com.callback.CallbackService" /> |
服务消费者调用示例:
CallbackServiceTest.java
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "classpath: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); } }); |
Labels:
None
Add Comment