[netty] netty心跳檢測,定時任務


  剛接觸Netty,寫的不好敬請諒解。

  最近有一個需求,需要從客戶端客戶端定時的向服務器發送數據,通知服務器自己的一些狀態信息,比如本地的cup使用率,內存使用率等信息,大體實現如下:

 

  是用到了java提供的線程池,newScheduledThreadPool:定長線程池,支持定時及周期性任務執行。

TestTask.java:

public class TestTask implements Runnable {

  private final ChannelHandlerContext ctx;

  public TestTask(ChannelHandlerContext ctx) {
    this.ctx = ctx;
  }

  @Override
  public void run() {
    //do something
    ctx.writeAndFlush(Unpooled.copiedBuffer(String.valueOf(System.currentTimeMillis()), CharsetUtil.UTF_8));
  }
}
  此類中的run方法可以執行其他的業務操作。

  此處是客戶端需要向服務器發送定時數據,故:

  NettyClientHandler:

public class NettyClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

  private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
  private ScheduledFuture<?> heartBeat;

  @Override
  public void channelActive(ChannelHandlerContext ctx) {
    this.heartBeat = this.scheduler.scheduleWithFixedDelay(new TestTask(ctx),0,2,TimeUnit.SECONDS);
  }

  @Override
  public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    System.out.println("channelInactive 連接斷開了");
  }


  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    cause.printStackTrace();
    ctx.close();
  }
}
  服務器代碼常規處理即可,此處並沒有證書認證之類的操作,故

  this.heartBeat = this.scheduler.scheduleWithFixedDelay(new TestTask(ctx),0,2,TimeUnit.SECONDS);
  寫在了channelActive方法中,若需要證書認證的操作,則channelActive中做證書認證的操作,而定時任務的操作寫在channelRead0方法中即可。
此處是客戶端向服務器發送定時任務,若服務器向客戶端發送定時任務,則做相應修改即可。

 

  也可做一些心跳檢測之類的業務操作。
————————————————
版權聲明:本文為CSDN博主「小夢_人生如戲」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yu532164710/article/details/83210940


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM