package com.hqyg.disjob.rpc.client.proxy; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import com.hqyg.disjob.common.util.UUIDHexGenerator; import com.hqyg.disjob.rpc.client.handler.EjobKillResponseHandler; import com.hqyg.disjob.rpc.client.handler.EjobRestartResponseHandler; import com.hqyg.disjob.rpc.codec.EjobKillTaskResponse; import com.hqyg.disjob.rpc.codec.EjobResponse; import com.hqyg.disjob.rpc.codec.EjobRestartTaskResponse; import com.hqyg.disjob.rpc.codec.EjobTaskDecoder; import com.hqyg.disjob.rpc.codec.Header; import com.hqyg.disjob.rpc.codec.RpcEncoder; import com.hqyg.disjob.rpc.codec.RpcRequest; import com.hqyg.disjob.rpc.codec.RpcRequestData; import com.hqyg.disjob.rpc.utils.PhpTaskCmd; import com.hqyg.disjob.rpc.utils.RpcConstants; public class ChannelBootStrap { NioEventLoopGroup group = null; public Bootstrap bootstrap = null; String host; int port; public ChannelBootStrap(final PhpTaskCmd cmd, final EjobResponse response, final CountDownLatch downLatch, String host, int port) { this.port = port; this.host = host; group = new NioEventLoopGroup(); bootstrap = new Bootstrap(); bootstrap.group(group); bootstrap.channel(NioSocketChannel.class); bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new EjobTaskDecoder(cmd, RpcConstants.MAX_FRAME_LENGTH, RpcConstants.LENGTH_FIELD_OFFSET, RpcConstants.LENGTH_FIELD_LENGTH)); pipeline.addLast(new RpcEncoder(RpcRequest.class)); EjobResponse tmp = response; if (cmd == cmd.RESTART) { pipeline.addLast(new EjobRestartResponseHandler(cmd,(EjobRestartTaskResponse) tmp, downLatch)); } else if (cmd == cmd.KILLTASK) { pipeline.addLast(new EjobKillResponseHandler(cmd,(EjobKillTaskResponse) tmp, downLatch)); } pipeline.addLast(new ChannelInboundHandlerAdapter() { @Override public void channelInactive(ChannelHandlerContext ctx)throws Exception { super.channelInactive(ctx); } }); } }); bootstrap.option(ChannelOption.TCP_NODELAY, true); bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,RpcConstants.CONNECT_TIMEOUT); } public void request(RpcRequest request) { try { ChannelFuture channelFuture = bootstrap.connect(host, port); final CountDownLatch downLatch = new CountDownLatch(1); channelFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future)throws Exception { downLatch.countDown(); } }); try { downLatch.await(3, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } Channel channel = null; boolean success = channelFuture.isSuccess(); if (success) { channel = channelFuture.channel(); channel.writeAndFlush(request); } } finally { } } public static void main(String[] args) { // EjobRestartTaskResponse response = new EjobRestartTaskResponse(); EjobKillTaskResponse response = new EjobKillTaskResponse(); CountDownLatch downLatch = new CountDownLatch(1); RpcRequest request = new RpcRequest(); Header header = new Header(); header.setType((byte) 15); header.setVersion(1); RpcRequestData data = new RpcRequestData(); data.setRequestId("ff808081581945c00158437017fe7fbc"); data.setRequestId(UUIDHexGenerator.generate()); request.setHeader(header); request.setData(data); String host = "10.40.6.100"; int port = 9501; ChannelBootStrap b = new ChannelBootStrap(PhpTaskCmd.KILLTASK, response, downLatch, host, port); b.request(request); try { downLatch.await(5, TimeUnit.SECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(); if (response != null) { System.out.println("yes:" + response); } /* * RpcRequest request = new RpcRequest(); Header header = new Header(); * header.setType((byte)14); header.setVersion(1); * * RpcRequestData data = new RpcRequestData(); * data.setRequestId("ff808081581945c00158437017fe7fbc"); * data.setIs_only_task(true); request.setHeader(header); * request.setData(data); ChannelBootStrap b = new * ChannelBootStrap(PhpTaskCmd.RESTART); b.request(request); */ } }