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