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.DefaultMuleException;
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.processor.MessageProcessor;
22 import org.mule.tck.junit4.AbstractMuleContextTestCase;
23
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.concurrent.atomic.AtomicInteger;
27
28 import org.junit.Test;
29
30 import static org.junit.Assert.assertEquals;
31
32 public class RoundRobinTestCase extends AbstractMuleContextTestCase
33 {
34 private final static int NUMBER_OF_ROUTES = 10;
35 private final static int NUMBER_OF_MESSAGES = 10;
36 private final AtomicInteger messageNumber = new AtomicInteger(0);
37
38 public RoundRobinTestCase()
39 {
40 setStartContext(true);
41 }
42
43 @Test
44 public void testRoundRobin() throws Exception
45 {
46 RoundRobin rr = new RoundRobin();
47 MuleSession session = getTestSession(getTestService(), muleContext);
48 List<TestProcessor> routes = new ArrayList<TestProcessor>(NUMBER_OF_ROUTES);
49 for (int i = 0; i < NUMBER_OF_ROUTES; i++)
50 {
51 routes.add(new TestProcessor());
52 }
53 rr.setRoutes(new ArrayList<MessageProcessor>(routes));
54 List<Thread> threads = new ArrayList<Thread>(NUMBER_OF_ROUTES);
55 for (int i = 0; i < NUMBER_OF_ROUTES; i++)
56 {
57 threads.add(new Thread(new TestDriver(session, rr, NUMBER_OF_MESSAGES)));
58 }
59 for (Thread t : threads)
60 {
61 t.start();
62 }
63 for (Thread t : threads)
64 {
65 t.join();
66 }
67 for (TestProcessor route : routes)
68 {
69 assertEquals(NUMBER_OF_MESSAGES, route.getCount());
70 }
71 }
72
73 class TestDriver implements Runnable
74 {
75 private MessageProcessor target;
76 private int numMessages;
77 private MuleSession session;
78
79 TestDriver(MuleSession session, MessageProcessor target, int numMessages)
80 {
81 this.target = target;
82 this.numMessages = numMessages;
83 this.session = session;
84 }
85
86 @Override
87 public void run()
88 {
89 for (int i = 0; i < numMessages; i++)
90 {
91 MuleMessage msg = new DefaultMuleMessage(TEST_MESSAGE + messageNumber.getAndIncrement(), muleContext);
92 MuleEvent event = new DefaultMuleEvent(msg, MessageExchangePattern.REQUEST_RESPONSE, session);
93 try
94 {
95 target.process(event);
96 }
97 catch (MuleException e)
98 {
99
100 }
101 }
102 }
103 }
104
105 static class TestProcessor implements MessageProcessor
106 {
107 private int count;
108 private List<Object> payloads = new ArrayList<Object>();
109
110 @Override
111 public MuleEvent process(MuleEvent event) throws MuleException
112 {
113 payloads.add(event.getMessage().getPayload());
114 count++;
115 if (count % 3 == 0)
116 {
117 throw new DefaultMuleException("Mule Exception!");
118 }
119 return null;
120 }
121
122 public int getCount()
123 {
124 return count;
125 }
126 }
127 }