diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java index 429de85..ee2f080 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java @@ -124,7 +124,7 @@ public class SocketIOChannelInitializer extends ChannelInitializer impl } } - packetHandler = new PacketHandler(packetListener, decoder, namespacesHub); + packetHandler = new PacketHandler(packetListener, decoder, namespacesHub, configuration.getExceptionListener()); authorizeHandler = new AuthorizeHandler(connectPath, scheduler, configuration, namespacesHub); StoreFactory factory = configuration.getStoreFactory(); diff --git a/src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java b/src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java index 341290d..813e55a 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java @@ -24,6 +24,7 @@ import io.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.corundumstudio.socketio.listener.ExceptionListener; import com.corundumstudio.socketio.messages.PacketsMessage; import com.corundumstudio.socketio.namespace.Namespace; import com.corundumstudio.socketio.namespace.NamespacesHub; @@ -41,12 +42,14 @@ public class PacketHandler extends SimpleChannelInboundHandler { private final PacketListener packetListener; private final Decoder decoder; private final NamespacesHub namespacesHub; + private final ExceptionListener exceptionListener; - public PacketHandler(PacketListener packetListener, Decoder decoder, NamespacesHub namespacesHub) { + public PacketHandler(PacketListener packetListener, Decoder decoder, NamespacesHub namespacesHub, ExceptionListener exceptionListener) { super(); this.packetListener = packetListener; this.decoder = decoder; this.namespacesHub = namespacesHub; + this.exceptionListener = exceptionListener; } @Override @@ -87,7 +90,9 @@ public class PacketHandler extends SimpleChannelInboundHandler { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception { - log.error("Exception occurs", e); + if (!exceptionListener.exceptionCaught(ctx, e)) { + super.exceptionCaught(ctx, e); + } } } diff --git a/src/main/java/com/corundumstudio/socketio/listener/DefaultExceptionListener.java b/src/main/java/com/corundumstudio/socketio/listener/DefaultExceptionListener.java index e46b33d..15b1969 100644 --- a/src/main/java/com/corundumstudio/socketio/listener/DefaultExceptionListener.java +++ b/src/main/java/com/corundumstudio/socketio/listener/DefaultExceptionListener.java @@ -15,6 +15,8 @@ */ package com.corundumstudio.socketio.listener; +import io.netty.channel.ChannelHandlerContext; + import java.util.List; import org.slf4j.Logger; @@ -51,4 +53,9 @@ public class DefaultExceptionListener extends ExceptionListenerAdapter { log.error(e.getMessage(), e); } + public boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception { + log.error(e.getMessage(), e); + return true; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/listener/ExceptionListener.java b/src/main/java/com/corundumstudio/socketio/listener/ExceptionListener.java index bbc799f..cbad76e 100644 --- a/src/main/java/com/corundumstudio/socketio/listener/ExceptionListener.java +++ b/src/main/java/com/corundumstudio/socketio/listener/ExceptionListener.java @@ -15,6 +15,8 @@ */ package com.corundumstudio.socketio.listener; +import io.netty.channel.ChannelHandlerContext; + import java.util.List; import com.corundumstudio.socketio.SocketIOClient; @@ -31,4 +33,6 @@ public interface ExceptionListener { void onJsonException(Exception e, Object data, SocketIOClient client); + boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception; + } diff --git a/src/main/java/com/corundumstudio/socketio/listener/ExceptionListenerAdapter.java b/src/main/java/com/corundumstudio/socketio/listener/ExceptionListenerAdapter.java index fbc8176..0faa156 100644 --- a/src/main/java/com/corundumstudio/socketio/listener/ExceptionListenerAdapter.java +++ b/src/main/java/com/corundumstudio/socketio/listener/ExceptionListenerAdapter.java @@ -15,6 +15,8 @@ */ package com.corundumstudio.socketio.listener; +import io.netty.channel.ChannelHandlerContext; + import java.util.List; import com.corundumstudio.socketio.SocketIOClient; @@ -24,7 +26,7 @@ import com.corundumstudio.socketio.SocketIOClient; * * */ -public class ExceptionListenerAdapter implements ExceptionListener { +public abstract class ExceptionListenerAdapter implements ExceptionListener { @Override public void onEventException(Exception e, List data, SocketIOClient client) { @@ -46,4 +48,9 @@ public class ExceptionListenerAdapter implements ExceptionListener { public void onJsonException(Exception e, Object data, SocketIOClient client) { } + @Override + public boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception { + return false; + } + } diff --git a/src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java b/src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java index 770c1ac..4c439e5 100644 --- a/src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java +++ b/src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java @@ -95,7 +95,7 @@ public class PacketHandlerTest { packets.add(packet); PacketListener listener = createTestListener(packets); - PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub); + PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub, null); testHandler(handler, new ConcurrentLinkedQueue(packets)); } @@ -114,7 +114,7 @@ public class PacketHandlerTest { packets.add(packet1); PacketListener listener = createTestListener(packets); - PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub); + PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub, null); testHandler(handler, new ConcurrentLinkedQueue(packets)); } @@ -133,7 +133,7 @@ public class PacketHandlerTest { packets.add(packet1); PacketListener listener = createTestListener(packets); - PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub); + PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub, null); testHandler(handler, new ConcurrentLinkedQueue(packets)); } @@ -152,7 +152,7 @@ public class PacketHandlerTest { public void onPacket(Packet packet, NamespaceClient client) { } }; - PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub); + PacketHandler handler = new PacketHandler(listener, decoder, namespacesHub, null); long start = System.currentTimeMillis(); ByteBuf buffer = Unpooled.wrappedBuffer("\ufffd10\ufffd3:::Привет\ufffd7\ufffd3:::53d\ufffd3\ufffd0::\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d\ufffd3\ufffd0::\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d\ufffd3\ufffd0::\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d\ufffd3\ufffd0::\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d\ufffd3\ufffd0::".getBytes()); for (int i = 0; i < 50000; i++) {