Netty writeAndFlush не работаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Netty writeAndFlush не работает

Сообщение Anonymous »

У меня возникла проблема с ошибкой netty writeAndFlush. В частности, объект Future возвращает false при вызове isSuccess. Вот трассировка стека:

Код: Выделить всё

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);
}

}
}
Я использую netty 4.2.7.Final.
Я использовал дерево зависимостей maven, чтобы убедиться, что я использую netty 4.2.7.Final.
Нет проблем с сетью, поскольку это происходит на одном и том же компьютере: оно не передается по сети.
Это не ошибка кодирования/декодирования — сообщение в порядке. сформировано.
Это не проблема с чрезмерными записями, потому что я не делаю много записей.
Это не проблема с закрытием или неактивностью канала, потому что я это проверил.
Я не знаю, связано ли это с завершением EventLoop, как вы это проверяете?
Что я могу попробовать?

Подробнее здесь: https://stackoverflow.com/questions/798 ... lush-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»