Wir haben ein Protokollierungssystem, das UDP-Multicast verwendet, um Protokollereignisse zu senden. Die Ereignisrate beträgt etwa 10.000 Ereignisse/Sekunde und die durchschnittliche Ereignisgröße beträgt etwa 2 KB.Java NIO UDP Multicast - verworfene Pakete
Die NIO-Version der Anwendung verliert bei jedem Test einen kleinen Prozentsatz von Ereignissen (ca. 2000 Ereignisse in ca. 12M). Hat jemand diesbezüglich irgendwelche Einsichten?
Beispielcode: Ohne NIO:
byte[] buf = new byte[65535];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
try {
while (!Thread.currentThread().isInterrupted()) {
socket.receive(packet);
final byte[] tmpBuffer = new byte[packet.getLength()];
System.arraycopy(packet.getData(), 0, tmpBuffer, 0,
tmpBuffer.length);
insertToNonBlockingQueue(tmpBuffer, packet.getSocketAddress());
}
} catch (Throwable t) {
throw new RuntimeException("Encountered exception in Acceptor", t);
} finally {
Util.closeQuietly(socket);
}
Mit NIO:
ByteBuffer inBuffer = ByteBuffer.allocate(65535);
try {
while (!Thread.currentThread().isInterrupted()) {
SocketAddress addr = channel.receive(inBuffer);
inBuffer.flip();
final byte[] tmpBuffer = new byte[inBuffer.limit()];
inBuffer.get(tmpBuffer);
inBuffer.clear();
insertToNonBlockingQueue(tmpBuffer, addr);
}
} catch (ClosedByInterruptException ex) {
log.info("Channel closed by interrupt"); // normal shutdown
} catch (Throwable t) {
throw new RuntimeException("Encountered exception in Acceptor", t);
} finally {
Util.closeQuietly(channel);
}
Sowohl die Zuhörer zugleich und jedes Mal, wenn die nicht NIO Version erfasst alle Log-Ereignisse ausgeführt werden, während die NIO-Version vermisst ein paar. Es handelt sich nicht um ein Netzwerkproblem, denn es ist das gleiche Verhalten, selbst wenn wir den Code auf eine andere Version auf einem Computer umstellen.
Entschuldigung, ich habe vergessen, die klare, wenn ich den Code einfügen eingefügt, ich hatte die buffer.clear() im Code und ich habe die Buchung bearbeitet, um es widerzuspiegeln – user2677485