Я пытаюсь реализовать обработчик трафика 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();
}
}