Netty writeAndFlush schlägt fehlJava

Java-Forum
Anonymous
 Netty writeAndFlush schlägt fehl

Post by Anonymous »

Ich habe ein Problem damit, dass Netty writeAndFlush fehlschlägt. Insbesondere gibt das zukünftige Objekt bei einem Aufruf von isSuccess „false“ zurück. Hier ist der Stacktrace:

Code: Select all

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)
Hier ist die Methode:

Code: Select all

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

}
}
Ich verwende netty 4.2.7.Final.
Ich habe den Maven-Abhängigkeitsbaum verwendet, um sicherzustellen, dass ich netty 4.2.7.Final ziehe
Es gibt keine Netzwerkprobleme, da es sich um denselben Computer handelt: Es geht nicht über die Leitung aus.
Dies ist kein Codierungs-/Decodierungsfehler – die Nachricht ist in Ordnung gebildet.
Das ist kein Problem mit übermäßigen Schreibvorgängen, weil ich nicht viele Schreibvorgänge mache.
Das ist kein Problem, wenn der Kanal geschlossen oder inaktiv ist, weil ich das überprüft habe.
Ich weiß nicht, ob das daran liegt, dass die EventLoop beendet wurde. Wie kann man das überprüfen?
Was kann ich versuchen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post