001 /*
002 * Copyright (C) The Apache Software Foundation. All rights reserved.
003 *
004 * This software is published under the terms of the Apache Software License
005 * version 1.1, a copy of which has been included with this distribution in
006 * the LICENSE file.
007 *
008 * $Id: DistributeBridgeMDO.java 155459 2005-02-26 13:24:44Z dirkv $
009 */
010 package org.apache.commons.messagelet;
011
012 import java.util.ArrayList;
013 import java.util.List;
014
015 import javax.jms.Destination;
016 import javax.jms.JMSException;
017 import javax.servlet.ServletException;
018
019 import org.apache.commons.logging.Log;
020 import org.apache.commons.logging.LogFactory;
021
022
023 /**
024 * <p><code>DistributeBridgeMDO</code> is an MDO which
025 * consumes JMS from one destination and randomly distributes
026 * them across a number of other destinations.
027 * This MDO can be used to provide a simple load balancing mechanism
028 * consuming from one destination and sending messages to a number of different
029 * physical destinations.
030 * </p>
031 *
032 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
033 * @version $Revision: 155459 $
034 */
035 public class DistributeBridgeMDO extends BridgeMDO {
036
037 /** Logger */
038 private static final Log log = LogFactory.getLog(DistributeBridgeMDO.class);
039
040 /** a List of output Destination objects */
041 private List outputDestinations = new ArrayList();
042
043 public DistributeBridgeMDO() {
044 }
045
046 // Properties
047 //-------------------------------------------------------------------------
048
049 /**
050 * @return a List of output Destinations
051 */
052 public List getOutputDestinations() {
053 return outputDestinations;
054 }
055
056 /**
057 * Adds a new output subject
058 */
059 public void addOutputSubject(String subject) throws JMSException {
060 Destination destination = getOutputMessenger().getDestination( subject );
061 outputDestinations.add( destination );
062 }
063
064
065
066 /**
067 * Randomly chooses a destination from the list of destinations
068 */
069 public Destination getOutputDestination() throws JMSException {
070 int size = outputDestinations.size();
071 if ( size < 1 ) {
072 throw new JMSException( "No output destinations are available" );
073 }
074
075 int index = (int) Math.round( Math.random() * size );
076 if ( index == size ) {
077 index = size -1;
078 }
079 return (Destination) outputDestinations.get(index);
080 }
081
082
083 // Implementation methods
084 //-------------------------------------------------------------------------
085
086 protected void validateOutputDestination() throws JMSException, ServletException {
087 int size = outputDestinations.size();
088 if ( size < 1 ) {
089 throw new JMSException( "No output destinations are available" );
090 }
091 }
092 }
093
094