1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.MuleSession;
16 import org.mule.api.routing.RoutingException;
17 import org.mule.config.i18n.CoreMessages;
18
19
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 public MuleMessage route(MuleMessage message, MuleSession session, boolean synchronous)
52 throws RoutingException
53 {
54 if (messageSize == 0 && numberOfMessages < 2)
55 {
56 return super.route(message, session, synchronous);
57 }
58 else if (messageSize > 0)
59 {
60 byte[] data = new byte[0];
61 try
62 {
63 data = message.getPayloadAsBytes();
64 }
65 catch (Exception e)
66 {
67 throw new RoutingException(CoreMessages.failedToReadPayload(), message, getEndpoint(0,
68 message), e);
69 }
70
71 int parts = data.length / messageSize;
72 if ((parts * messageSize) < data.length)
73 {
74 parts++;
75 }
76 int len = messageSize;
77 MuleMessage part = null;
78 int count = 0;
79 int pos = 0;
80 byte[] buffer = null;
81 try
82 {
83 for (; count < parts; count++)
84 {
85 if ((pos + len) > data.length)
86 {
87 len = data.length - pos;
88 }
89 buffer = new byte[len];
90 System.arraycopy(data, pos, buffer, 0, buffer.length);
91 pos += len;
92 part = new DefaultMuleMessage(buffer, message);
93 part.setCorrelationId(message.getUniqueId());
94 part.setCorrelationGroupSize(parts);
95 part.setCorrelationSequence(count);
96
97
98 if (logger.isInfoEnabled())
99 {
100 logger.info("sending part " + count + " of " + parts);
101 }
102 super.route(part, session, synchronous);
103 if (logger.isInfoEnabled())
104 {
105 logger.info("sent");
106 }
107 }
108
109 }
110 catch (RoutingException e)
111 {
112
113 e = new RoutingException(e.getI18nMessage(), e.getUmoMessage(), e.getEndpoint(), e.getCause());
114
115
116
117
118 throw e;
119 }
120 }
121 return message;
122 }
123 }