目前我正在开展一个关于跟踪gps设备的项目。因为它们通过TCP与自定义(包含html之类的二进制数据)协议进行通信,所以netty是第一选择。但现在我们遇到了一些严重的问题。
因为我们必须根据连接的设备将调试打印增强的所有接收数据记录到不同的文件,所以我们引入了一个扩展ChannelStateEvent的LogEvent。这是我们发现从管道中的任何位置到特定文件完成日志记录的唯一合适方式。
现在记录基本上如下: channel.getPipeline()。sendUpstream(new LogEvent(channel,record))
为了简化并获得现代日志API的所有功能,我们将其包装在一个自定义类ChannelLogger中,我们可以使用它们:
ChannelLogger.fine(channel, "...");
ChannelLogger.info(channel, "...");
ChannelLogger.warn(channel, "...", [Throwable]);
我的问题是, 如果频道关闭,如何让LogEvents保留在管道中?
// handler 1
ChannelLogger.warn(channel, ...);
...
// handler 2
channel.close();
立即关闭,因此管道中的所有剩余数据都将被丢弃,因此我们的日志事件(大多数错误描述了频道关闭的原因)也是如此。
提前致谢,Eric
答案 0 :(得分:2)
首先为什么你不只是添加一个SimpleChannelHandler并覆盖其中的每个方法并在那里进行日志记录?这也可以保护你的一些分配,因为你不需要为所有事情发射额外的事件。
现在回答你的问题......这应该可以解决问题:
channel.write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);