View Javadoc

1   /*
2    * EL4J, the Extension Library for the J2EE, adds incremental enhancements to
3    * the spring framework, http://el4j.sf.net
4    * Copyright (C) 2006 by ELCA Informatique SA, Av. de la Harpe 22-24,
5    * 1000 Lausanne, Switzerland, http://www.elca.ch
6    *
7    * EL4J is published under the GNU Lesser General Public License (LGPL)
8    * Version 2.1. See http://www.gnu.org/licenses/
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU Lesser General Public License for more details.
14   *
15   * For alternative licensing, please contact info@elca.ch
16   */
17  package ch.elca.el4j.services.remoting.protocol.loadbalancing.policy;
18  
19  import java.util.Calendar;
20  import java.util.Random;
21  
22  import org.slf4j.Logger;
23  import org.slf4j.LoggerFactory;
24  
25  import ch.elca.el4j.services.remoting.AbstractRemotingProtocol;
26  import ch.elca.el4j.services.remoting.protocol.loadbalancing.NoProtocolAvailableRTException;
27  
28  /**
29   *
30   * Chooses the protocol according to a random policy. Protocols for whom a
31   * failure has been notified, are removed.
32   *
33   * @svnLink $Revision: 3883 $;$Date: 2009-08-04 15:35:01 +0200 (Di, 04. Aug 2009) $;$Author: swismer $;$URL: https://el4j.svn.sourceforge.net/svnroot/el4j/branches/el4j_3_1/el4j/framework/modules/remoting_core/src/main/java/ch/elca/el4j/services/remoting/protocol/loadbalancing/policy/RandomPolicy.java $
34   *
35   * @author Stefan Pleisch (SPL)
36   */
37  public class RandomPolicy extends AbstractPolicy {
38  
39  	/**
40  	 * Private logger.
41  	 */
42  	private static Logger s_logger = LoggerFactory
43  			.getLogger(RandomPolicy.class);
44  
45  	/**
46  	 * Random number generator.
47  	 */
48  	private Random m_random
49  		= new Random(Calendar.getInstance().getTimeInMillis());
50  	
51  	/**
52  	 * {@inheritDoc}
53  	 */
54  	@Override
55  	public AbstractRemotingProtocol getNextProtocol()
56  		throws NoProtocolAvailableRTException {
57  		if ((m_protocols == null) || (m_protocols.length == 0)) {
58  			throw new NoProtocolAvailableRTException("No protocol defined");
59  		}
60  		AbstractRemotingProtocol protocol
61  			= m_protocols[m_random.nextInt(m_protocols.length)];
62  		s_logger.debug("Returning next protocol: " + protocol);
63  		return protocol;
64  	}
65  
66  	/**
67  	 * {@inheritDoc}
68  	 */
69  	public void notifyFailure(AbstractRemotingProtocol protocol) {
70  		s_logger.debug("Removing protocol: " + protocol);
71  		removeProtocol(protocol);
72  	}
73  }