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

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

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