1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.DefaultMuleMessage;
15 import org.mule.api.MuleEvent;
16 import org.mule.api.MuleMessage;
17 import org.mule.api.MuleSession;
18 import org.mule.api.routing.RoutingException;
19 import org.mule.config.i18n.CoreMessages;
20
21
22
23
24
25
26 public class MessageChunkingRouter extends FilteringOutboundRouter
27 {
28 private int messageSize = 0;
29 private int numberOfMessages = 1;
30
31 public int getMessageSize()
32 {
33 return messageSize;
34 }
35
36 public void setMessageSize(int messageSize)
37 {
38 this.messageSize = messageSize;
39 }
40
41 public int getNumberOfMessages()
42 {
43 return numberOfMessages;
44 }
45
46 public void setNumberOfMessages(int numberOfMessages)
47 {
48 this.numberOfMessages = numberOfMessages;
49 }
50
51 @Override
52 public MuleEvent route(MuleEvent event) throws RoutingException
53 {
54 MuleMessage message = event.getMessage();
55 MuleSession session = event.getSession();
56 if (messageSize == 0 && numberOfMessages < 2)
57 {
58 return super.route(event);
59 }
60 else if (messageSize > 0)
61 {
62 byte[] data;
63 try
64 {
65 data = message.getPayloadAsBytes();
66 }
67 catch (Exception e)
68 {
69 throw new RoutingException(CoreMessages.failedToReadPayload(), event, getRoute(0, event), e);
70 }
71
72 int parts = data.length / messageSize;
73 if ((parts * messageSize) < data.length)
74 {
75 parts++;
76 }
77 int len = messageSize;
78 MuleMessage part;
79 int count = 0;
80 int pos = 0;
81 byte[] buffer;
82 try
83 {
84 for (; count < parts; count++)
85 {
86 if ((pos + len) > data.length)
87 {
88 len = data.length - pos;
89 }
90 buffer = new byte[len];
91 System.arraycopy(data, pos, buffer, 0, buffer.length);
92 pos += len;
93 part = new DefaultMuleMessage(buffer, message, muleContext);
94 part.setCorrelationId(message.getUniqueId());
95 part.setCorrelationGroupSize(parts);
96 part.setCorrelationSequence(count);
97
98 if (logger.isInfoEnabled())
99 {
100 logger.info(String.format("sending part %d of %d (seq # %d)", count + 1, parts, count));
101 }
102 super.route(new DefaultMuleEvent(part, event.getEndpoint(), session));
103 if (logger.isInfoEnabled())
104 {
105 logger.info("sent");
106 }
107 }
108 }
109 catch (RoutingException e)
110 {
111
112 e = new RoutingException(e.getI18nMessage(), e.getEvent(), e.getRoute(), e.getCause());
113
114
115
116
117 throw e;
118 }
119 }
120 return event;
121 }
122 }