我的要求:
我想检测通道是否空闲以便读取一段时间并希望基于此超时.My Netty客户端正在向1000台服务器发送请求.
问题:我的Netty客户端永远不会显示如果有时候有任何空闲信道,即使我使用的是一些总是超时的ips.我怀疑我没有正确实现IdleStateHandler.我试过减少IdleStateHandler的读取超时但没有运气.我花了好几个小时搞清楚这一点.任何帮助将非常感激.
所以,下面是我的代码:
My Netty Client:
public void connect(final InetAddress remoteAddress){
new Bootstrap()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
.group(eventLoopGroup)
.channel(NioSocketChannel.class)
.handler(httpNettyClientChannelInitializer)
.connect(remoteAddress, serverPort)
.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
future.cancel(!future.isSuccess());
}
});
}
Run Code Online (Sandbox Code Playgroud)
My Netty Channel Initalizer:
public class HttpNettyClientChannelInitializer extends ChannelInitializer<SocketChannel> {
private final Provider<HttpNettyClientChannelHandler> handlerProvider;
private final int timeout;
private int maxContentLength;
@Inject
public HttpNettyClientChannelInitializer(Provider<HttpNettyClientChannelHandler> handlerProvider,
@Named("readResponseTimeout") int timeout, @Named("maxContentLength") int maxContentLength) {
this.handlerProvider = handlerProvider;
this.timeout = timeout;
this.maxContentLength = maxContentLength;
}
@Override
protected void initChannel(SocketChannel socketChannel) {
ChannelPipeline pipelineNettyClientChannel = socketChannel.pipeline();
pipelineNettyClientChannel.addLast("codec", new HttpClientCodec());
pipelineNettyClientChannel.addLast("idleStateHandler", new IdleStateHandler(timeout,0,0, TimeUnit.MILLISECONDS));
pipelineNettyClientChannel.addLast("aggregator", new HttpObjectAggregator(maxContentLength));
//handlerProvider.get() will provide new instance of channel handler
pipelineNettyClientChannel.addLast("handler", handlerProvider.get());
}
}
Run Code Online (Sandbox Code Playgroud)
我的网络频道处理程序
@ChannelHandler.Sharable
public class HttpNettyClientChannelHandler extends SimpleChannelInboundHandler<HttpObject> {
@Override
public void channelActive(ChannelHandlerContext channelHandlerContext){...}
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject){...}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.READER_IDLE) {
System.out.println("Idle channel");
ctx.close();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一些不匹配的 .jar 库会导致此类错误。你检查过版本和兼容性吗?
https://github.com/netty/netty
-> 测试 -> 检查问题可能是你之前声明的问题吗?
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |