package com.taobao.zeus.socket.master.reqresp;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import org.jboss.netty.channel.Channel;
import com.taobao.zeus.socket.master.AtomicIncrease;
import com.taobao.zeus.socket.master.MasterContext;
import com.taobao.zeus.socket.master.MasterHandler.ResponseListener;
import com.taobao.zeus.socket.protocol.Protocol.CancelMessage;
import com.taobao.zeus.socket.protocol.Protocol.ExecuteKind;
import com.taobao.zeus.socket.protocol.Protocol.Operate;
import com.taobao.zeus.socket.protocol.Protocol.Request;
import com.taobao.zeus.socket.protocol.Protocol.Response;
import com.taobao.zeus.socket.protocol.Protocol.SocketMessage;
import com.taobao.zeus.socket.protocol.Protocol.WebResponse;
import com.taobao.zeus.socket.protocol.Protocol.SocketMessage.Kind;
public class MasterCancelJob {
public Future<Response> cancel(final MasterContext context,Channel channel,ExecuteKind ek,String id){
// 如果在运行中 从worker列表中查询正在运行该job的woker,发出取消命令
// 如果在等待队列,从等待队列删除
// 如果都不在,抛出异常
CancelMessage cm=CancelMessage.newBuilder().setEk(ek).setId(id).build();
final Request req=Request.newBuilder().setRid(AtomicIncrease.getAndIncrement()).setOperate(Operate.Cancel)
.setBody(cm.toByteString()).build();
SocketMessage sm=SocketMessage.newBuilder().setKind(Kind.REQUEST).setBody(req.toByteString()).build();
Future<Response> f=context.getThreadPool().submit((new Callable<Response>() {
private Response response;
public Response call() throws Exception {
final CountDownLatch latch=new CountDownLatch(1);
context.getHandler().addListener(new ResponseListener() {
public void onWebResponse(WebResponse resp) {}
public void onResponse(Response resp) {
if(req.getRid()==resp.getRid()){
context.getHandler().removeListener(this);
response=resp;
latch.countDown();
}
}
});
latch.await();
return response;
}
}));
channel.write(sm);
return f;
}
}