Код: Выделить всё
12:49:04.062 [Timer-0] ERROR com.ltsllc.miranda.netty.OutboundHeartBeatHandler - heartbeat start failed
io.netty.util.IllegalReferenceCountException: refCnt: 0
at io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1480)
at io.netty.buffer.UnpooledHeapByteBuf.array(UnpooledHeapByteBuf.java:147)
at com.ltsllc.miranda.netty.ChannelOutboundMonitor.write(ChannelOutboundMonitor.java:44)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:827)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:752)
at com.ltsllc.miranda.netty.NullTerminatedOutboundFrame.write(NullTerminatedOutboundFrame.java:31)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:827)
at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1136)
Код: Выделить всё
public synchronized void sendHeartBeat() {
iterations++;
if (iterations % 100 == 0) {
System.gc();
}
if (channel == null || !channel.isOpen()) {
logger.error("null or closed channel");
return;
}
AlarmClock.getInstance().scheduleOnce(this, Alarms.HEART_BEAT,
Miranda.getProperties().getLongProperty(Miranda.PROPERTY_HEART_BEAT_INTERVAL));
if (Miranda.getProperties().getBooleanProperty(Miranda.PROPERTY_USE_HEARTBEATS)) {
if (System.currentTimeMillis() >
timeOfLastActivity + Miranda.getProperties().getLongProperty(Miranda.PROPERTY_HEART_BEAT_INTERVAL)) {
String message = Node.HEART_BEAT_START;
ByteBuf byteBuf = Unpooled.copiedBuffer(message.getBytes());
ChannelFuture future = channel.writeAndFlush(byteBuf);
long delay = Miranda.getProperties().getLongProperty(Miranda.PROPERTY_HEART_BEAT_TIMEOUT);
AlarmClock.getInstance().scheduleOnce(this, Alarms.HEART_BEAT_TIMEOUT, delay);
metTimeout = false;
try {
future.await();
if (!future.isSuccess()) {
logger.error("heartbeat start failed");
future.cause().printStackTrace();
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
Я использовал дерево зависимостей maven, чтобы убедиться, что я использую netty 4.2.7.Final.
Нет проблем с сетью, поскольку это происходит на одном и том же компьютере: оно не передается по сети.
Это не ошибка кодирования/декодирования — сообщение в порядке. сформировано.
Это не проблема с чрезмерными записями, потому что я не делаю много записей.
Это не проблема с закрытием или неактивностью канала, потому что я это проверил.
Я не знаю, связано ли это с завершением EventLoop, как вы это проверяете?
Что я могу попробовать?
Подробнее здесь: https://stackoverflow.com/questions/798 ... lush-fails
Мобильная версия