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