最近研究Dubbo,涉及到java 回调机制,所以,就看了下这方面的资料
1.java回调机制
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知
2.Demo
2.1 定义api
package com.weizhi.callback.api;
/**
* @ClassName IService
* @Description 服务提供者
* @Author weizhi2018
* @Date 2013-10-25 上午10:31:34
*
*/
public interface IService {
public void service(ICallback callback,String msg);
}
----------------------------------------------------------------------------------------
package com.weizhi.callback.api;
/**
* @ClassName ICallback
* @Description 被回调的类
* @Author weizhi2018
* @Date 2013-10-25 上午10:15:58
*
*/
public interface ICallback {
public void notice(String data);
}
2.2 实现api
package com.weizhi.callback.impl;
import com.weizhi.callback.api.ICallback;
public class CallbackImpl implements ICallback {
private ServiceImpl service = new ServiceImpl();
/*
* @see com.weizhi.callback.api.ICallback#notify(java.lang.String)
*/
@Override
public void notice(String data) {
//处理回调结果
System.out.println("NoticeData:" + data);
}
public void sendRequest(String sendMsg){
//请求servie服务
System.out.println("RequestMsg:" + sendMsg);
service.service(CallbackImpl.this, sendMsg);
}
}
package com.weizhi.callback.impl;
import com.weizhi.callback.api.ICallback;
import com.weizhi.callback.api.IService;
public class ServiceImpl implements IService{
/*
* @see com.weizhi.callback.api.IService#service(com.weizhi.callback.api.ICallback, java.lang.String)
*/
@Override
public void service(ICallback callback, String msg) {
//处理请求,并回调处理结果
if("bbbb".equals(msg)){
callback.notice("successed.");
}
else{
callback.notice("failed.");
}
}
}
2.3 运行实例
package com.weizhi.callback.main;
import com.weizhi.callback.impl.CallbackImpl;
public class MainStart {
public static void main(String args[]){
CallbackImpl callback = new CallbackImpl();
String msg1 = "aaaa";
String msg2 = "bbbb";
callback.sendRequest(msg1);
callback.sendRequest(msg2);
}
}
输出:
RequestMsg:aaaa
NoticeData:failed.
RequestMsg:bbbb
NoticeData:successed.
3 总结
在Dubbo里面,服务器提供者和回调接口,都是远程通信。