1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.DefaultMuleMessage;
15 import org.mule.MessageExchangePattern;
16 import org.mule.api.MuleContext;
17 import org.mule.api.MuleEvent;
18 import org.mule.api.MuleException;
19 import org.mule.api.MuleMessage;
20 import org.mule.api.MuleSession;
21 import org.mule.api.endpoint.ImmutableEndpoint;
22 import org.mule.api.service.Service;
23 import org.mule.routing.correlation.CorrelationSequenceComparator;
24 import org.mule.routing.correlation.EventCorrelatorCallback;
25 import org.mule.routing.correlation.ResequenceMessagesCorrelatorCallback;
26 import org.mule.tck.AbstractMuleTestCase;
27 import org.mule.tck.MuleTestUtils;
28 import org.mule.tck.testmodels.fruit.Apple;
29
30 import java.util.Comparator;
31
32 public class ResequencerTestCase extends AbstractMuleTestCase
33 {
34
35 public ResequencerTestCase()
36 {
37 setStartContext(true);
38 }
39
40 public void testMessageResequencer() throws Exception
41 {
42 MuleSession session = getTestSession(getTestService(), muleContext);
43 Service testService = getTestService("test", Apple.class);
44 assertNotNull(testService);
45
46 TestEventResequencer router = new TestEventResequencer(3);
47 router.setMuleContext(muleContext);
48 router.setFlowConstruct(testService);
49 router.initialise();
50
51 MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
52 MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
53 MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
54 final String correlationId = message1.getUniqueId();
55 message1.setCorrelationId(correlationId);
56 message2.setCorrelationId(correlationId);
57 message3.setCorrelationId(correlationId);
58
59 ImmutableEndpoint endpoint = MuleTestUtils.getTestOutboundEndpoint(MessageExchangePattern.ONE_WAY, muleContext);
60 MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
61 MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
62 MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session);
63
64 assertNull(router.process(event2));
65 assertNull(router.process(event3));
66
67 MuleEvent resultEvent = router.process(event1);
68 assertNotNull(resultEvent);
69 MuleMessage resultMessage = resultEvent.getMessage();
70 assertNotNull(resultMessage);
71
72 assertEquals("test event A", resultMessage.getPayloadAsString());
73
74
75
76 router = new TestEventResequencer(3);
77 router.setMuleContext(muleContext);
78 router.setEventComparator(new EventPayloadComparator());
79 router.setFlowConstruct(testService);
80 router.initialise();
81
82
83 assertNull(router.process(event2));
84 assertNull(router.process(event3));
85
86 resultEvent = router.process(event1);
87 assertNotNull(resultEvent);
88 resultMessage = resultEvent.getMessage();
89 assertNotNull(resultMessage);
90
91 assertEquals("test event C", resultMessage.getPayloadAsString());
92 }
93
94 public static class TestEventResequencer extends Resequencer
95 {
96 private int eventCount = 0;
97 private int eventthreshold = 1;
98
99 public TestEventResequencer(int eventthreshold)
100 {
101 super();
102 this.eventthreshold = eventthreshold;
103 this.setEventComparator(new CorrelationSequenceComparator());
104 }
105
106 @Override
107 protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext)
108 {
109 return new ResequenceMessagesCorrelatorCallback(getEventComparator(), muleContext)
110 {
111 @Override
112 public boolean shouldAggregateEvents(EventGroup events)
113 {
114 eventCount++;
115 if (eventCount == eventthreshold)
116 {
117 eventCount = 0;
118 return true;
119 }
120 return false;
121 }
122 };
123 }
124 }
125
126 public static class EventPayloadComparator implements Comparator
127 {
128 public int compare(Object o1, Object o2)
129 {
130 try
131 {
132 return ((MuleEvent) o1).getMessageAsString().compareTo(((MuleEvent) o2).getMessageAsString());
133 }
134 catch (MuleException e)
135 {
136 throw new IllegalArgumentException(e.getMessage());
137 }
138
139 }
140 }
141 }