netty不同的channelpool和异常进程

时间:2017-06-13 09:40:16

标签: error-handling netty channel

我是netty的新手,我在使用netty计划时遇到了问题。

  1. initConnection方法中,我想为每个组制作不同的channelpool

    当用户组A进入我的sendToMessage时,我想创建channelPool A 就像这样,用户组B进入我的sendToMessage我要创建channelPool B,下次如果用户组A再次进入,我将返回channelPool A

    • 尝试这样做是对的吗?有可能吗?
    1. FixedChannelPool错误处理

      • 告诉我如何处理FixedChannelPool错误?我可以使用acquireTimeoutMillis而不是time.how吗?
    2. 这是我的代码

      @Service
      public class NettyPoolService {
      
      public static final AttributeKey<CompletableFuture<String>> FUTURE = AttributeKey.valueOf("future");
      private static final StringDecoder stringDecoder = new StringDecoder(CharsetUtil.UTF_8);
      private static final StringEncoder stringEncoder = new StringEncoder(CharsetUtil.UTF_8);
      private static ChannelPool channelPool;
      private static EventLoopGroup eventLoopGroup;
      
      @Value("${host}")
      private String host;
      
      @Value("${port}")
      private String port;
      
      @Value("${connection.count}")
      private String numberOfConnections;
      
      @Value("${thread.count}")
      private String numberOfThreads;
      
      
      private synchronized void initConnection (String host, int port, int numberOfThreads, int numberOfConnections,String userGroup) {
      
      if ( (channelPool != null) && (eventLoopGroup != null) ) {
      return;
      }
      System.out.println("#############################################");
      System.out.println("initConnection start");
      
      eventLoopGroup = new NioEventLoopGroup(numberOfThreads);
      
      Bootstrap bootstrap = new Bootstrap();
      bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
      bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
      //bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
      //bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);
      //bootstrap.option(ChannelOption.TCP_NODELAY, true);
      
      bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).remoteAddress(host, port);
      
      int acquireTimeoutMillis = 10000;
      int maxPendingAcquires = Integer.MAX_VALUE;
      
      channelPool = new FixedChannelPool(bootstrap,   
      new AbstractChannelPoolHandler() {      
      
      public void channelCreated(Channel ch) throws Exception {
      ChannelPipeline pipeline = ch.pipeline();
      // decoders
      pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
      pipeline.addLast("stringDecoder", stringDecoder);
      
      // encoders
      pipeline.addLast("stringEncoder", stringEncoder);
      
      // business logic handler
      pipeline.addLast("clientHandler", new ClientPoolHandler(channelPool));
      }
      }, 
      ChannelHealthChecker.ACTIVE,//eventloop
      AcquireTimeoutAction.NEW,   //timeout
      acquireTimeoutMillis,       //
      numberOfConnections,        //
      maxPendingAcquires);        //
      
      System.out.println("initConnection End");
      System.out.println("#############################################");
      
      
      
      }//initConnection
      
      
      
      public void sendToMessage(String message,String GroupId) {
      
      System.out.println("=============GroupId=============:"+GroupId); 
      if (channelPool == null) {
      initConnection(host, Integer.parseInt(port.trim()), Integer.parseInt(numberOfThreads.trim()), Integer.parseInt(numberOfConnections.trim()) );
      }
      
      final CompletableFuture<String> future = new CompletableFuture<String>();
      Future<Channel> channelFuture = channelPool.acquire();
      
      
      System.out.println("=============channelFuture.get()=============:"+channelFuture.toString()); 
      channelFuture.addListener(new FutureListener<Channel>() {
      public void operationComplete(Future<Channel> f) {
      if (f.isSuccess()) {
      Channel channel = f.getNow();
      channel.attr(NettyPoolClientService.FUTURE).set(future);
      channel.writeAndFlush(message, channel.voidPromise());
      }
      }
      });
      
      
      channelFuture.syncUninterruptibly();
      
      
      }//sendToBnp
      }
      

0 个答案:

没有答案