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