红框代码其实表示该方法只是进行了透传,不做任何业务逻辑处理,让 channelPipe 中的下一个 handler 处理channelRead 方法
我们再看看 channelActive
方法:
这里有个 initialize
的方法,这是 IdleStateHandler
的精髓,接着探究:
这边会触发一个 Task,ReaderIdleTimeoutTask
,这个task里的 run 方法源码是这样的:
第一个红框代码是用当前时间减去最后一次 channelRead
方法调用的时间,假如这个结果是6s,说明最后一次调用channelRead 已经是6s之前的事情了,你设置的是5s,那么 nextDelay
则为-1,说明超时了,那么第二个红框代码则会触发下一个 handler 的 userEventTriggered
方法:
如果没有超时则不触发 userEventTriggered
方法。
服务端代码
public class HeartBeatServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup();
try{
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline channelPipeline = socketChannel.pipeline();
channelPipeline.addLast(“decoder”,new StringDecoder());
channelPipeline.addLast(“encoder”,new StringEncoder());
channelPipeline.addLast(new IdleStateHandler(3,0,0, TimeUnit.SECONDS));
channelPipeline.addLast(new HeartBeatServerHandler());
}
});
System.out.println(“netty server start。。”);
ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
channelFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}
复制代码
继承 SimpleChannelInboundHandler
重写 channelRead
方法和 userEventTriggered
方法
public class HeartBeatServerHandler extends SimpleChannelInboundHandler {
int readIdleTimes = 0;
@Override
protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception {
System.out.println(" ====== > [server] message received : " + s);
if (“Heartbeat Packet”.equals(s)){
ctx.channel().writeAndFlush(“ok”);
}else{
System.out.println(" 其他信息处理…");
}
}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
IdleStateEvent event = (IdleStateEvent) evt;
String eventType = null;
switch (event.state()){
case READER_IDLE:
eventType = “读空闲”;
readIdleTimes++; // 读空闲的计数加1
break;
case WRITER_IDLE:
eventType = “写空闲”;
// 不处理
break;
case ALL_IDLE:
eventType = “读写空闲”;
// 不处理
break;
}
System.out.println(ctx.channel().remoteAddress() + “超时事件:” + eventType);
if (readIdleTimes > 3){
System.out.println(" [server]读空闲超过3次,关闭连接,释放更多资源");
ctx.channel().writeAndFlush(“idle close”);
ctx.channel().close();
}
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.err.println(“=== " + ctx.channel().remoteAddress() + " is active ===”);
}
}
复制代码
客户端代码
public class HeartBeatClient {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try{
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline channelPipeline = socketChannel.pipeline();
channelPipeline.addLast(“decoder”,new StringDecoder());
channelPipeline.addLast(“encoder”,new StringEncoder());
channelPipeline.addLast(new HeartBeatClientHandler());
}
});
System.out.println(“netty client start。。”);
Channel channel = bootstrap.connect(“127.0.0.1”, 8888).sync().channel();
String text = “Heartbeat Packet”;
Random random = new Random();
while(channel.isActive()){
int num = random.nextInt(8);
Thread.sleep(num*1000);
channel.writeAndFlush(text);
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
中…(img-GcpflBCs-1723559534648)]
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
[外链图片转存中…(img-gOHMmbCy-1723559534649)]
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
[外链图片转存中…(img-sP9xS9BK-1723559534649)]