提交 6ffe4400 编写于 作者: C chao.liuc

解决setcallback 时可能出现的并发问题 DUBBO-750

git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@43 1a56cb94-b969-4eaa-88fa-be21384802f2
上级 3f34281f
......@@ -39,6 +39,7 @@ import com.alibaba.dubbo.remoting.exchange.Response;
* DefaultFuture.
*
* @author qian.lei
* @author chao.liuc
*/
public class DefaultFuture implements ResponseFuture {
......@@ -110,8 +111,9 @@ public class DefaultFuture implements ResponseFuture {
}
public void cancel(){
response = new Response(id);
response.setErrorMessage("request future has been canceled.");
Response errorResult = new Response(id);
errorResult.setErrorMessage("request future has been canceled.");
response = errorResult ;
FUTURES.remove(id);
CHANNELS.remove(id);
}
......@@ -122,14 +124,37 @@ public class DefaultFuture implements ResponseFuture {
public void setCallback(ResponseCallback callback) {
if (isDone()) {
try {
callback.done(returnFromResponse());
} catch (Throwable e) {
callback.caught(e);
}
invokeCallback(callback);
} else {
boolean isdone = false;
lock.lock();
try{
if (!isDone()) {
this.callback = callback;
} else {
isdone = true;
}
}finally {
lock.unlock();
}
if (isdone){
invokeCallback(callback);
}
}
}
private void invokeCallback(ResponseCallback c){
if (c == null){
throw new NullPointerException("callback cannot be null.");
}
ResponseCallback callbackCopy = c;
c = null;
Object result = null;
try {
result = returnFromResponse();
} catch (Throwable e) {
callbackCopy.caught(e);
}
callbackCopy.done(result);
}
private long getId() {
......@@ -198,14 +223,8 @@ public class DefaultFuture implements ResponseFuture {
} finally {
lock.unlock();
}
ResponseCallback c = callback;
if (c != null) {
try {
c.done(returnFromResponse());
} catch (Throwable e) {
c.caught(e);
}
callback = null;
if (callback != null) {
invokeCallback(callback);
}
}
......@@ -217,8 +236,6 @@ public class DefaultFuture implements ResponseFuture {
if (res.getStatus() == Response.CLIENT_TIMEOUT || res.getStatus() == Response.SERVER_TIMEOUT) {
throw new TimeoutException(res.getStatus() == Response.SERVER_TIMEOUT, channel, res.getErrorMessage());
}
FUTURES.remove(id);
CHANNELS.remove(id);
throw new RemotingException(channel, res.getErrorMessage());
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册