摘要:最近抽时间系统的学习了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

二:项目结构

Dubbo、Spring、Zookeeper、集成基础案例(参数回调)_参数回调

三:服务提供者、这里的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();*/

}
}

五:运行结果

Dubbo、Spring、Zookeeper、集成基础案例(参数回调)_xml_02