public RpcFuture(Request request) { this.request = request; this.timeout = this.request.getMillisTimeOut(); this.startTime = System.currentTimeMillis(); this.futureId = request.getId(); futures.put(this.futureId, this); if (!scanClean) { scanClean = true; this.scanCleanTimeOut(); } }
@Override public void sentOneWay(Request request) throws Exception { Channel channel = getChannel(request); if (channel != null && channel.isActive()) { RpcFuture rpcFuture = new RpcFuture(request); channel.writeAndFlush(request).addListener(new FutureListener(rpcFuture)); } else { throw new IllegalArgumentException("[JobX] NettyRPC invokeAsync invokeOneway channel not active. request id:" + request.getId()); } }
@Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { if (logger.isInfoEnabled()) { logger.info("[JobX] NettyRPC sent success, request id:{}", rpcFuture.getRequest().getId()); } return; } else { if (logger.isInfoEnabled()) { logger.info("[JobX] NettyRPC sent failure, request id:{}", rpcFuture.getRequest().getId()); } if (this.rpcFuture != null) { rpcFuture.caught(future.cause()); } } futureTable.remove(rpcFuture.getFutureId()); }
@Override public void sentAsync(Request request, final InvokeCallback callback) throws Exception { Channel channel = getChannel(request); if (channel != null && channel.isActive()) { RpcFuture rpcFuture = new RpcFuture(request, callback); channel.writeAndFlush(request).addListener(new FutureListener(rpcFuture)); } else { throw new IllegalArgumentException("[JobX] NettyRPC invokeAsync channel not active. request id:" + request.getId()); } }
@Override public Response sentSync(Request request) throws TimeoutException { Channel channel = getChannel(request); if (channel != null && channel.isActive()) { RpcFuture rpcFuture = new RpcFuture(request); channel.writeAndFlush(request).addListener(new FutureListener(rpcFuture)); return rpcFuture.get(); } else { throw new IllegalArgumentException("[JobX] NettyRPC invokeSync channel not active. request id:" + request.getId()); } }
@Override public void operationComplete(IoFuture future) { if (future.isDone()) { if (logger.isInfoEnabled()) { logger.info("[JobX] MinaRPC sent success, request id:{}", rpcFuture.getRequest().getId()); } return; } else { if (logger.isInfoEnabled()) { logger.info("[JobX] MinaRPC sent failure, request id:{}", rpcFuture.getRequest().getId()); } if (rpcFuture != null) { rpcFuture.caught(getConnect(rpcFuture.getRequest()).getException()); } } futureTable.remove(rpcFuture.getRequest().getId()); }
@Override public void channelActive(ChannelHandlerContext handlerContext) throws Exception { if (request.getAction().equals(Action.UPLOAD)) { try { requestFile = request.getUploadFile(); randomAccessFile = new RandomAccessFile(requestFile.getFile(), "r"); requestFile.setFileSize(randomAccessFile.length()); randomAccessFile.seek(requestFile.getStarPos()); byte[] bytes = new byte[requestFile.getReadBuffer()]; if ((byteRead = randomAccessFile.read(bytes)) != -1) { requestFile.setEndPos(byteRead); requestFile.setBytes(bytes); request.setUploadFile(requestFile); handlerContext.writeAndFlush(request); requestFile.setBytes(null); requestFile.setEndPos(-1); logger.info("[JobX] NettyRPC file upload,readLength starting... request id:{}", request.getId()); } else { logger.info("[JobX] NettyRPC file upload,readLength done! request id:{}", request.getId()); } } catch (Exception e) { e.printStackTrace(); } return; } }
@Override public void sentAsync(final Request request, final InvokeCallback callback) throws Exception { final ConnectFuture connect = super.getConnect(request); if (connect != null && connect.isConnected()) { RpcFuture rpcFuture = new RpcFuture(request,callback); connect.addListener(new AbstractClient.FutureListener(rpcFuture)); connect.getSession().write(request); } else { throw new IllegalArgumentException("[JobX] MinaRPC invokeAsync channel not active. request id:" + request.getId()); } }
@Override public void sentOneWay(final Request request) throws Exception { ConnectFuture connect = super.getConnect(request); if (connect != null && connect.isConnected()) { RpcFuture rpcFuture = new RpcFuture(request); connect.addListener(new AbstractClient.FutureListener(rpcFuture)); connect.getSession().write(request); } else { throw new IllegalArgumentException("[JobX] MinaRPC channel not active. request id:" + request.getId()); } }
public static Response response(Request request) { return new Response().setAction(request.getAction()).setId(request.getId()).start(); }
@Override public Response sentSync(final Request request) throws Exception { final ConnectFuture connect = super.getConnect(request); if (connect != null && connect.isConnected()) { RpcFuture rpcFuture = new RpcFuture(request); //写数据 connect.addListener(new AbstractClient.FutureListener(rpcFuture)); IoSession session = connect.getSession(); session.write(request); return rpcFuture.get(); } else { throw new IllegalArgumentException("[JobX] MinaRPC channel not active. request id:" + request.getId()); } }
logger.debug("[JobX]Receive request {}" + request.getId());