『Netty核心』Netty心跳机制

红框代码其实表示该方法只是进行了透传,不做任何业务逻辑处理,让 channelPipe 中的下一个 handler 处理channelRead 方法

我们再看看 channelActive 方法:

这里有个 initialize 的方法,这是 IdleStateHandler 的精髓,接着探究:

image.png

这边会触发一个 TaskReaderIdleTimeoutTask,这个task里的 run 方法源码是这样的:

image.png

第一个红框代码是用当前时间减去最后一次 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个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

中…(img-GcpflBCs-1723559534648)]

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

[外链图片转存中…(img-gOHMmbCy-1723559534649)]

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

[外链图片转存中…(img-sP9xS9BK-1723559534649)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值