How to handle exception in decoders/handlers?

infectedrhythms voodoo at videotron.ca
Fri Jun 19 15:14:28 EDT 2009


Ok I have it working

The StringEncoder in the pipeline does the trick.

Here is my final handler

@ChannelPipelineCoverage("all")
public class MyHandler extends SimpleChannelHandler {


	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

		Channel ch = e.getChannel();
		ChannelFuture cf = ch.write("Hello!");

		// Will close the channel once the write is done.
		cf.addListener(ChannelFutureListener.CLOSE);
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {

		Channel ch = e.getChannel();
		ChannelFuture cf = ch.write("Error!");

		// Will close the channel once the write is done.
		cf.addListener(ChannelFutureListener.CLOSE);
	}	
}





infectedrhythms wrote:
> 
> There lots of things to grasp here but would this work?
> 
> public class MPIPipelineFactory implements ChannelPipelineFactory {
> 
> 	//@Override
> 	public ChannelPipeline getPipeline() throws Exception {
> 
> 		ChannelPipeline pipeline = Channels.pipeline();
> 
>         pipeline.addLast("framer", new MyDecoder(5));
>         pipeline.addLast("handler", new MyHandler());
>         pipeline.addLast("stringEncoder", new StringEncoder("UTF-8"));
> 		
> 		return pipeline;
> 	}
> }
> 
> And then in exceptionCaught(... ExceptionEvent e)
> {
> e.getChannel.write("...");
> }
> 
> 
> 
> 
> infectedrhythms wrote:
>> 
>> Is there a simple sample to follow?
>> 
>> Trustin Lee (via Nabble) wrote:
>>> You need an encoder.
>>>
>>> On 2009-06-20 오전 3:21, infectedrhythms wrote:
>>>
>>> >
>>> > Ok so now the exception is the last handler.
>>> >
>>> > But how do I write to the socket as
>>> >
>>> > @Override
>>> > public void exceptionCaught(ChannelHandlerContext ctx, 
>>> ExceptionEvent e) {
>>> >
>>> > e.getCause().printStackTrace();
>>> >
>>> > e.getChannel().write("Test");
>>> >
>>> >
>>> > //ChannelFuture cf = ch.write("Test");
>>> >
>>> > //cf.addListener(ChannelFutureListener.CLOSE);
>>> > //ch.close();
>>> > }
>>> >
>>> > throws...
>>> >
>>> >
>>> > java.lang.ClassCastException: java.lang.String cannot be cast to
>>> > org.jboss.netty.buffer.ChannelBuffer
>>> > at
>>> > 
>>> org.jboss.netty.channel.socket.nio.NioWorker.writeUnfair(NioWorker.java:438) 
>>>
>>> > at 
>>> org.jboss.netty.channel.socket.nio.NioWorker.write(NioWorker.java:411)
>>> > at
>>> > 
>>> org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:138) 
>>>
>>> > at
>>> > 
>>> org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:78) 
>>>
>>> > at org.jboss.netty.channel.Channels.write(Channels.java:626)
>>> > at org.jboss.netty.channel.Channels.write(Channels.java:592)
>>> > at 
>>> org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:203)
>>> > at
>>> > 
>>> com.rbs.threedsecure.mpi.services.broker.ThreeDHandler.exceptionCaught(ThreeDHandler.java:51) 
>>>
>>> > at
>>> > 
>>> com.rbs.threedsecure.mpi.services.broker.ThreeDHandler.handleUpstream(ThreeDHandler.java:32) 
>>>
>>> > at
>>> > 
>>> org.jboss.netty.handler.codec.frame.FrameDecoder.exceptionCaught(FrameDecoder.java:194) 
>>>
>>> > at 
>>> org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:440)
>>> > at
>>> > 
>>> org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:59) 
>>>
>>> > at 
>>> org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:293)
>>> > at 
>>> org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:280)
>>> > at
>>> > 
>>> org.jboss.netty.channel.socket.nio.NioWorker.readIntoHeapBuffer(NioWorker.java:300) 
>>>
>>> > at
>>> > 
>>> org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:254) 
>>>
>>> > at
>>> org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:163)
>>> > at
>>> > 
>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
>>>
>>> > at
>>> > 
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
>>>
>>> > at java.lang.Thread.run(Thread.java:619)
>>> >
>>> >
>>> >
>>> > Trustin Lee wrote:
>>> >>
>>> >> Hi,
>>> >>
>>> >> It seems like one of the handlers in your pipeline closes the 
>>> connection
>>> >> on an exceptionCaught event (perhaps the last handler.)  I would
>>> catch
>>> >> the exception in the last handler and send the error message there
>>> >> rather than sending it in the decoder, because it's often a good 
>>> idea to
>>> >> separate protocol state from codec.
>>> >>
>>> >> HTH,
>>> >> Trustin
>>> >>
>>> >> On 2009-06-20 오전 2:42, infectedrhythms wrote:
>>> >>>
>>> >>> Hi, I have implemented a simple decoder and it works fine.
>>> >>>
>>> >>> Now if there is an error I want to throw an exception catch and
>>> reply
>>> >>> back
>>> >>> to the client, kind of like an HTTP 500 error.
>>> >>>
>>> >>> So if the decoder fails it should write back to the client the 
>>> error that
>>> >>> occurred.
>>> >>>
>>> >>> @Override
>>> >>> protected Object decode(ChannelHandlerContext ctx, Channel channel,
>>> >>> ChannelBuffer buf) throws Exception {
>>> >>>
>>> >>> ... do stuff here...
>>> >>>
>>> >>> throw new Exception("Errrorrrr!");
>>> >>> }
>>> >>>
>>> >>> @Override
>>> >>> public void exceptionCaught(ChannelHandlerContext ctx, 
>>> ExceptionEvent e)
>>> >>> throws Exception {
>>> >>>
>>> >>> super.exceptionCaught(ctx, e);
>>> >>>
>>> >>> e.getChannel().write("Damn it Jim!"); <-- Throws a
>>> >>> ClosedChannelException
>>> >>>
>>> >>> }
>>> >>
>>> >>
>>> >> --
>>> >> — Trustin Lee, http://gleamynode.net/
>>> >>
>>> >>
>>> >>  
>>> >> _______________________________________________
>>> >> netty-users mailing list
>>> >> netty-users at ... 
>>> <http://n2.nabble.com/user/SendEmail.jtp?type=node&node=3121435&i=0>
>>> >> https://lists.jboss.org/mailman/listinfo/netty-users
>>> >>
>>> >>
>>> >
>>>
>>> -- 
>>> — Trustin Lee, http://gleamynode.net/
>>>
>>>
>>>
>>> _______________________________________________
>>> netty-users mailing list
>>> netty-users at ... 
>>> <http://n2.nabble.com/user/SendEmail.jtp?type=node&node=3121435&i=1>
>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>
>>> *signature.asc* (266 bytes) Download Attachment 
>>> <http://n2.nabble.com/attachment/3121435/0/signature.asc>
>>> Trustin Lee, Principal Software Engineer, JBoss, a division of Red Hat
>>> -- 
>>> what we call human nature is actually human habit
>>> -- 
>>> http://gleamynode.net/
>>>
>>>
>>> ------------------------------------------------------------------------
>>> This email is a reply to your post @ 
>>> http://n2.nabble.com/How-to-handle-exception-in-decoders-handlers--tp3121070p3121435.html
>>> You can reply by email or by visting the link above.
>>>
>> 
>> 
>> 
>> 
> 
> 

-- 
View this message in context: http://n2.nabble.com/How-to-handle-exception-in-decoders-handlers--tp3121070p3121604.html
Sent from the Netty User Group mailing list archive at Nabble.com.





More information about the netty-users mailing list