WorkerInfoHolder.java 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package com.jd.platform.jlog.client.worker;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.concurrent.CopyOnWriteArrayList;
  6. /**
  7. * 存储该客户端支持的worker列表
  8. * @author wuweifeng
  9. * @date 2020-01-13
  10. * @version 1.0
  11. */
  12. public class WorkerInfoHolder {
  13. /**
  14. * 保存worker的ip地址和Channel的映射关系,这是有序的。每次client发送消息时,都会根据该map的size进行hash
  15. * 如key-1就发送到workerHolder的第1个Channel去,key-2就发到第2个Channel去
  16. */
  17. private static final List<String> WORKER_HOLDER = new CopyOnWriteArrayList<>();
  18. /**
  19. * 坐标
  20. */
  21. private static int index = 0;
  22. /**
  23. * 发消息到哪个worker,在这里挑一个
  24. */
  25. public static String chooseWorker() {
  26. String workerIp = "127.0.0.1:9999";
  27. int size = WORKER_HOLDER.size();
  28. if (size == 0) {
  29. return workerIp;
  30. }
  31. //按本机ip对worker数量进行hash
  32. // int index = Math.abs(IpUtils.getIp().hashCode() % size);
  33. if (index >= WORKER_HOLDER.size()) {
  34. index = 0;
  35. }
  36. try {
  37. workerIp = WORKER_HOLDER.get(index);
  38. } catch (Exception e) {
  39. return WORKER_HOLDER.get(0);
  40. }
  41. index++;
  42. return workerIp;
  43. }
  44. //多播模式 返回所有注册在注册中心为Work的地址
  45. public static List<String> selectWorkers(){
  46. List<String>defaultIps=new ArrayList<>();
  47. defaultIps.add("127.0.0.1:9999");
  48. if(WORKER_HOLDER.size()==0){
  49. return defaultIps;
  50. }
  51. return WORKER_HOLDER;
  52. }
  53. /**
  54. * 监听到worker信息变化后
  55. * 将新的worker信息和当前的进行合并,并且连接新的address
  56. * address例子:10.12.139.152:11111
  57. */
  58. public static void mergeAndConnectNew(List<String> allAddresses) {
  59. if (allAddresses.size() == 0) {
  60. WORKER_HOLDER.clear();
  61. return;
  62. }
  63. //将新的进行排序
  64. Collections.sort(allAddresses);
  65. //对比是否两个list是否一样,如果一样就什么也不干
  66. if (WORKER_HOLDER.equals(allAddresses)) {
  67. return;
  68. }
  69. //变更WORKER_HOLDER
  70. WORKER_HOLDER.clear();
  71. WORKER_HOLDER.addAll(allAddresses);
  72. }
  73. }