摘要:最近抽时间系统的学习了Dubbo的一些内容,趁有时间,整理下,顺便记录下,以防以后回顾。前面我们学校了Dubbo的xml、注解方式,本次我们学习下Dubbo的参数回调。
一:运行环境
1>:JDK 1.8
2>:IDEA 2018.1
3>:Zookeeper 3.x
4>:Maven 3.2
5>:Dubbo 2.8.4
二:项目结构
三:服务提供者、这里的pom.xml和Provider.java上一篇的一样就不贴上来了
CallBackListener.java
package com.micai.dubbo.provider;
/**
* @Auther: zhaoxinguo
* @Date: 2018/9/11 16:30
* @Description: 参数回调监听器
*/
public interface CallBackListener {
/**
* 调用服务提供方
* @param msg
*/
void changed(String msg);
}
CallBackService.java
package com.micai.dubbo.provider;
/**
* @Auther: zhaoxinguo
* @Date: 2018/9/11 16:29
* @Description: 参数回调
*/
public interface CallBackService {
/**
* 接口对消费者暴露的服务
* @param key
* @param callBackListener
*/
void addListener(String key, CallBackListener callBackListener);
}
CallBackServiceImpl.java
package com.micai.dubbo.provider;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Auther: zhaoxinguo
* @Date: 2018/9/11 16:31
* @Description: 接口的实现类
*/
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); // timely trigger change event
} 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)); // send notification for change
}
private String getChanged(String key) {
return "Changed: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--提供方应用信息,用于计算依赖关系-->
<dubbo:application name="hello-world-app"/>
<!--使⽤zookeeper注册中⼼暴露服务地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--<!–声明需要暴露的服务接口–>
<dubbo:service interface="com.micai.dubbo.provider.DemoService" ref="demoService"/>
<!–和本地bean一样实现服务–>
<bean id="demoService" class="com.micai.dubbo.provider.DemoServiceImpl"/>-->
<!--参数回调-->
<bean id="callBackService" class="com.micai.dubbo.provider.CallBackServiceImpl"/>
<dubbo:service interface="com.micai.dubbo.provider.CallBackService" ref="callBackService" connections="1" callbacks="1000">
<dubbo:method name="addListener">
<dubbo:argument index="1" callback="true"/>
</dubbo:method>
</dubbo:service>
<!--扫描注解包路径,多个包⽤逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类-->
<dubbo:annotation package="com.micai.dubbo.provider"/>
</beans>
四:服务消费者、这里的pom.xml和上一篇的一样就不贴上来了
CallBackAction.java
package com.micai.dubbo.consumer;
import com.alibaba.dubbo.config.annotation.Reference;
import com.micai.dubbo.provider.CallBackListener;
import com.micai.dubbo.provider.CallBackService;
import org.springframework.stereotype.Component;
/**
* @Auther: zhaoxinguo
* @Date: 2018/9/11 17:46
* @Description: 参数回调
*/
@Component
public class CallBackAction {
@Reference
private CallBackService callBackService;
public void getChanges() {
callBackService.addListener("zhaoxinguo", new CallBackListener() {
@Override
public void changed(String msg) {
System.out.println("callback: " + msg);
}
});
}
}
Consumer.java
package com.micai.dubbo;
import com.micai.dubbo.consumer.CallBackAction;
import com.micai.dubbo.consumer.DemoAction;
import com.micai.dubbo.consumer.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Auther: zhaoxinguo
* @Date: 2018/9/11 14:36
* @Description:
*/
public class Consumer {
public static void main(String [] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
classPathXmlApplicationContext.start();
// 同步调用
/*DemoAction demoAction = (DemoAction) classPathXmlApplicationContext.getBean("demoAction");
String str = demoAction.sayHello();
System.out.println("同步调用结果: " + str);*/
// 2.6.x版本之前的异步调用方式
/*UserAction userAction = (UserAction) classPathXmlApplicationContext.getBean("userAction");
// 通过RpcContext获取Future
userAction.getUserName();
// 拿到Dubbo内置的ResponseFuture并设置回调
userAction.getUserName2();*/
// 参数回调
CallBackAction callBackAction = classPathXmlApplicationContext.getBean("callBackAction", CallBackAction.class);
callBackAction.getChanges();
// -------------------- 全异步的Dubbo服务调用链 -------------------- //
// CompletableFuture类型接口实现异步调用
/*AsyncAction asyncAction = (AsyncAction) classPathXmlApplicationContext.getBean("asyncAction");
asyncAction.asyncSayHello();*/
// 同步接口使用Annotation Processor实现异步调用
/*GreetingsAction greetingsAction = (GreetingsAction) classPathXmlApplicationContext.getBean("greetingsAction");
greetingsAction.sayHi();*/
}
}
五:运行结果