package netty.cookbook.chapter2.recipe7; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; import java.util.Date; import java.util.LinkedList; import java.util.Queue; import java.util.Timer; import java.util.TimerTask; public class HeartBeatHandler extends SimpleChannelInboundHandler<DatagramPacket> { private static final Queue<String> logQueue = new LinkedList<String>(); static String log(String log) { return String.valueOf(logQueue.add(log)); } static { new Timer(true).schedule(new TimerTask() { @Override public void run() { while ( ! logQueue.isEmpty() ) { // log to Kafka or somewhere String s = logQueue.poll(); if(s != null){ System.out.println(s); } } } }, 1000, 2000); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); // We don't close the channel because we can keep serving requests. } @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { System.err.println(packet); String s = packet.content().toString(CharsetUtil.UTF_8); System.out.println(s); ByteBuf buf = Unpooled.copiedBuffer("I'm alive at "+new Date(), CharsetUtil.UTF_8); ctx.write(new DatagramPacket(buf, packet.sender())); } }