Как получить глобальную статистику трафика на netty сервере для нескольких TCP-клиентских подключений - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь реализовать обработчик трафика netty для нескольких соединений TCP-клиентов.Добавление обработчика трафика в конвейер - это нормально.Я могу отслеживать значения cumulativeReadBytes и cumulativeWrittenBytes для одного TCP-клиента через каждые checkInterval миллисекунды.Я использую doAccounting как переопределенный метод.

Но проблема начинается, когда речь идет о множественных TCP-клиентских подключениях.doAccounting вызывается (опять же, при каждом значении checkInterval, конечно) для каждого отдельного TCP-клиентского соединения, но это нарушает планирование и вызывает метод doAccounting, вызываемый почти бесконечно для большого количества TCP-клиентских соединений.(По сути, новый периодический вызов создается для каждого клиентского подключения. Мне нужен один единственный вызов для всех подключений, полученных через прослушивающий порт)

Есть ли способ глобального мониторинга трафика для всех клиентских подключений TCP в пределах одногоsingle doAccounting call?

Заранее спасибо.

Вот мой метод обработки сервера:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 100)
                .childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel argSocketChannel) throws Exception {
            ChannelPipeline pipeline = argSocketChannel.pipeline();
            pipeline.addLast(new ReadTimeoutHandler(21600));
            pipeline.addLast(new MyTrafficHandler(5000));
            pipeline.addLast(new MyEncoder());
            pipeline.addLast(new MyDecoder(), new MyHandler(argProducer, argHandler, serverName));
        }
    });
    ChannelFuture future = b.bind(argPort).sync();
    future.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

А вот MyTrafficHandler class:

public class MyTrafficHandler extends ChannelTrafficShapingHandler {

public MyTrafficHandler(long checkInterval) {
    super(checkInterval);
}

@Override
protected void doAccounting(TrafficCounter counter) {
    System.out.println(counter.cumulativeReadBytes() + ":::" + counter.cumulativeWrittenBytes());
    counter.resetCumulativeTime();
}
}
...