View Javadoc

1   /*
2    * $Id$
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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                      ; // this is expected
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 }