View Javadoc

1   /*
2    * Copyright (C) The Apache Software Foundation. All rights reserved.
3    *
4    * This software is published under the terms of the Apache Software License
5    * version 1.1, a copy of which has been included with this distribution in
6    * the LICENSE file.
7    * 
8    * $Id: DistributeBridgeMDO.java 155459 2005-02-26 13:24:44Z dirkv $
9    */
10  package org.apache.commons.messagelet;
11  
12  import java.util.ArrayList;
13  import java.util.List;
14  
15  import javax.jms.Destination;
16  import javax.jms.JMSException;
17  import javax.servlet.ServletException;
18  
19  import org.apache.commons.logging.Log;
20  import org.apache.commons.logging.LogFactory;
21  
22  
23  /** 
24   * <p><code>DistributeBridgeMDO</code> is an MDO which 
25   * consumes JMS from one destination and randomly distributes
26   * them across a number of other destinations.
27   * This MDO can be used to provide a simple load balancing mechanism
28   * consuming from one destination and sending messages to a number of different
29   * physical destinations.
30   * </p>
31   *
32   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
33   * @version $Revision: 155459 $
34   */
35  public class DistributeBridgeMDO extends BridgeMDO {
36  
37      /** Logger */
38      private static final Log log = LogFactory.getLog(DistributeBridgeMDO.class);
39  
40      /** a List of output Destination objects */
41      private List outputDestinations = new ArrayList();
42        
43      public DistributeBridgeMDO() {
44      }
45      
46      // Properties
47      //-------------------------------------------------------------------------
48  
49      /**
50       * @return a List of output Destinations
51       */    
52      public List getOutputDestinations() {
53          return outputDestinations;
54      }
55      
56      /**
57       * Adds a new output subject
58       */
59      public void addOutputSubject(String subject) throws JMSException {
60          Destination destination = getOutputMessenger().getDestination( subject );
61          outputDestinations.add( destination );
62      }
63      
64      
65      
66      /**
67       * Randomly chooses a destination from the list of destinations
68       */
69      public Destination getOutputDestination() throws JMSException {
70          int size = outputDestinations.size();
71          if ( size < 1 ) {
72              throw new JMSException( "No output destinations are available" );
73          }
74          
75          int index = (int) Math.round( Math.random() * size );
76          if ( index == size ) {
77              index = size -1;
78          }
79          return (Destination) outputDestinations.get(index);        
80      }
81      
82      
83      // Implementation methods
84      //-------------------------------------------------------------------------
85  
86      protected void validateOutputDestination() throws JMSException, ServletException {
87          int size = outputDestinations.size();
88          if ( size < 1 ) {
89              throw new JMSException( "No output destinations are available" );
90          }
91      }
92  }
93  
94