1
2
3
4
5
6
7
8
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.endpoint.InboundEndpoint;
16 import org.mule.api.lifecycle.CreateException;
17 import org.mule.api.service.Service;
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
32
33
34
35
36 public class ExceptionReturnTcpMessageReceiver extends TcpMessageReceiver
37 {
38
39 public ExceptionReturnTcpMessageReceiver(Connector connector, Service service, InboundEndpoint endpoint)
40 throws CreateException
41 {
42 super(connector, service, endpoint);
43 }
44
45 protected Work createWork(Socket socket) throws IOException
46 {
47 return new TcpWorker(socket, this);
48 }
49
50 protected class TcpWorker extends TcpMessageReceiver.TcpWorker
51 {
52
53 public TcpWorker(Socket socket, AbstractMessageReceiver receiver) throws IOException
54 {
55 super(socket, receiver);
56 }
57
58 protected Object getNextMessage(Object resource) throws Exception
59 {
60 try
61 {
62 return super.getNextMessage(resource);
63 }
64 catch (Exception e)
65 {
66 manageException(e);
67 return null;
68 }
69 }
70
71 private void manageException(Exception readingException) throws Exception
72 {
73 try
74 {
75 logger.warn("Failed to read message: " + readingException);
76
77 MuleMessage msg = new DefaultMuleMessage(NullPayload.getInstance(), connector.getMuleContext());
78 ExceptionPayload exceptionPayload = new DefaultExceptionPayload(readingException);
79 msg.setExceptionPayload(exceptionPayload);
80 List msgList = new ArrayList(1);
81 msgList.add(msg);
82
83 handleResults(msgList);
84 }
85 catch (Exception writingException)
86 {
87 logger.warn("Failed to write exception back to client: " + writingException);
88 throw writingException;
89 }
90 }
91 }
92 }