View Javadoc

1   /*
2    * $Id: ExceptionReturnTcpMessageReceiver.java 20320 2010-11-24 15:03:31Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  package org.mule.transport.tcp;
11  
12  import org.mule.DefaultMuleMessage;
13  import org.mule.api.ExceptionPayload;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.construct.FlowConstruct;
16  import org.mule.api.endpoint.InboundEndpoint;
17  import org.mule.api.lifecycle.CreateException;
18  import org.mule.api.transport.Connector;
19  import org.mule.message.DefaultExceptionPayload;
20  import org.mule.transport.AbstractMessageReceiver;
21  import org.mule.transport.NullPayload;
22  
23  import java.io.IOException;
24  import java.net.Socket;
25  import java.util.ArrayList;
26  import java.util.List;
27  
28  import javax.resource.spi.work.Work;
29  
30  /**
31   * Extends {@link TcpMessageReceiver} providing managing of protocol error conditions.
32   * {@link TcpMessageReceiver.TcpWorker#getNextMessage(Object)} is extended so, in case
33   * of an protocol error it will try to send the exception back to the client instead
34   * of ignoring it. If an exception is thrown managing the error it will ignored.
35   */
36  public class ExceptionReturnTcpMessageReceiver extends TcpMessageReceiver
37  {
38  
39      public ExceptionReturnTcpMessageReceiver(Connector connector, FlowConstruct flowConstruct,
40           InboundEndpoint endpoint)
41              throws CreateException
42      {
43          super(connector, flowConstruct, endpoint);
44      }
45  
46      @Override
47      protected Work createWork(Socket socket) throws IOException
48      {
49          return new TcpWorker(socket, this);
50      }
51  
52      protected class TcpWorker extends TcpMessageReceiver.TcpWorker
53      {
54  
55          public TcpWorker(Socket socket, AbstractMessageReceiver receiver) throws IOException
56          {
57              super(socket, receiver);
58          }
59  
60          @Override
61          protected Object getNextMessage(Object resource) throws Exception
62          {
63              try
64              {
65                  return super.getNextMessage(resource);
66              }
67              catch (Exception e)
68              {
69                  manageException(e);
70                  return null;
71              }
72          }
73  
74          private void manageException(Exception readingException) throws Exception
75          {
76              try
77              {
78                  logger.warn("Failed to read message: " + readingException);
79  
80                  MuleMessage msg = new DefaultMuleMessage(NullPayload.getInstance(), connector.getMuleContext());
81                  ExceptionPayload exceptionPayload = new DefaultExceptionPayload(readingException);
82                  msg.setExceptionPayload(exceptionPayload);
83                  List msgList = new ArrayList(1);
84                  msgList.add(msg);
85  
86                  handleResults(msgList);
87              }
88              catch (Exception writingException)
89              {
90                  logger.warn("Failed to write exception back to client: " + writingException);
91                  throw writingException;
92              }
93          }
94      }
95  }