99import org .slf4j .Logger ;
1010import org .slf4j .LoggerFactory ;
1111
12+ import java .util .ArrayList ;
13+ import java .util .List ;
1214import java .util .concurrent .ConcurrentHashMap ;
15+ import java .util .concurrent .ThreadLocalRandom ;
1316
1417/**
1518 * @author Robert HG (254963746@qq.com) on 8/17/14.
16- * 客户端节点管理
19+ * 客户端节点管理
1720 */
1821public class JobClientManager {
1922
@@ -36,7 +39,7 @@ public void addNode(Node node) {
3639 ChannelWrapper channel = ChannelManager .getChannel (node .getGroup (), node .getNodeType (), node .getIdentity ());
3740 ConcurrentHashSet <JobClientNode > jobClientNodes = NODE_MAP .get (node .getGroup ());
3841
39- synchronized (NODE_MAP ){
42+ synchronized (NODE_MAP ) {
4043 if (jobClientNodes == null ) {
4144 jobClientNodes = new ConcurrentHashSet <JobClientNode >();
4245 NODE_MAP .put (node .getGroup (), jobClientNodes );
@@ -58,7 +61,7 @@ public void removeNode(Node node) {
5861 ConcurrentHashSet <JobClientNode > jobClientNodes = NODE_MAP .get (node .getGroup ());
5962 if (jobClientNodes != null && jobClientNodes .size () != 0 ) {
6063 for (JobClientNode jobClientNode : jobClientNodes ) {
61- if (node .getIdentity ().equals (jobClientNode .getIdentity ())){
64+ if (node .getIdentity ().equals (jobClientNode .getIdentity ())) {
6265 LOGGER .info ("删除JobClient节点:{}" , jobClientNode );
6366 jobClientNodes .remove (jobClientNode );
6467 }
@@ -68,31 +71,49 @@ public void removeNode(Node node) {
6871
6972 /**
7073 * 得到 可用的 客户端节点
74+ *
7175 * @param nodeGroup
7276 * @return
7377 */
7478 public JobClientNode getAvailableJobClient (String nodeGroup ) {
7579
7680 ConcurrentHashSet <JobClientNode > jobClientNodes = NODE_MAP .get (nodeGroup );
81+
7782 if (jobClientNodes == null || jobClientNodes .size () == 0 ) {
7883 return null ;
7984 }
8085
81- for (JobClientNode jobClientNode : jobClientNodes ) {
86+ int size = jobClientNodes .size ();
87+ int index = getRandomIndex (size );
88+
89+ List <JobClientNode > list = new ArrayList <JobClientNode >(jobClientNodes );
90+
91+ JobClientNode jobClientNode = null ;
92+ int retry = 0 ;
93+ while (jobClientNode == null && retry < size ) {
94+ jobClientNode = list .get (index );
8295 // 如果 channel 已经关闭, 更新channel, 如果没有channel, 略过
83- if (jobClientNode .getChannel () == null || jobClientNode .getChannel ().isClosed ()) {
96+ if (jobClientNode != null && ( jobClientNode .getChannel () == null || jobClientNode .getChannel ().isClosed () )) {
8497 ChannelWrapper channel = ChannelManager .getChannel (jobClientNode .getNodeGroup (), NodeType .CLIENT , jobClientNode .getIdentity ());
8598 if (channel != null ) {
8699 // 更新channel
87100 jobClientNode .setChannel (channel );
88101 } else {
89- continue ;
102+ jobClientNode = null ;
90103 }
91104 }
92-
93- return jobClientNode ;
105+ index = ( index + 1 ) % size ;
106+ retry ++ ;
94107 }
95108
96- return null ;
109+ return jobClientNode ;
110+ }
111+
112+ private int getRandomIndex (int size ) {
113+ int min = 1 ;
114+ int max = size ;
115+ ThreadLocalRandom random = ThreadLocalRandom .current ();
116+ return random .nextInt (max ) % (max - min + 1 ) + min - 1 ;
97117 }
118+
98119}
0 commit comments