1 /*
2 * JBoss, Home of Professional Open Source
3 * Copyright 2005, JBoss Inc., and individual contributors as indicated
4 * by the @authors tag. See the copyright.txt in the distribution for a
5 * full listing of individual contributors.
6 *
7 * This is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation; either version 2.1 of
10 * the License, or (at your option) any later version.
11 *
12 * This software is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this software; if not, write to the Free
19 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21 */
22 package org.jboss.ha.framework.interfaces;
23
24 import java.util.List;
25 import java.util.Random;
26
27 import org.jboss.invocation.Invocation;
28
29 /**
30 * LoadBalancingPolicy implementation that always fully randomly select its target
31 * (without basing its decision on any historic).
32 *
33 * @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>.
34 * @version $Revision: 56192 $
35 * @see org.jboss.ha.framework.interfaces.LoadBalancePolicy
36 */
37 public class RandomRobin implements LoadBalancePolicy
38 {
39 // Constants -----------------------------------------------------
40 /** @since 1.1.2.3 */
41 private static final long serialVersionUID = -3599638697906618428L;
42 /** This needs to be a class variable or else you end up with multiple
43 * Random numbers with the same seed when many clients lookup a proxy.
44 */
45 public static final Random localRandomizer = new Random (System.currentTimeMillis ());
46
47 // Static --------------------------------------------------------
48
49 // Constructors --------------------------------------------------
50
51 // Public --------------------------------------------------------
52
53 // LoadBalancePolicy implementation ----------------------------------------------
54
55 public void init (HARMIClient father)
56 {
57 // do not use the HARMIClient in this policy
58 }
59
60 public Object chooseTarget (FamilyClusterInfo clusterFamily)
61 {
62 return chooseTarget(clusterFamily, null);
63 }
64 public Object chooseTarget (FamilyClusterInfo clusterFamily, Invocation routingDecision)
65 {
66 List targets = clusterFamily.getTargets ();
67 int max = targets.size();
68
69 if (max == 0)
70 return null;
71
72 int cursor = localRandomizer.nextInt (max);
73 return targets.get(cursor);
74 }
75
76 }