RabbitMQ音讯队列应用 @RabbitListener 接管音讯,队列名称应用常量命名,然而如果应用动静队列名称,比方依据零碎 ip 命名队列名称。

获取服务器 IP

/**     * 获取服务器ip,解决linux获取ip为127.0.0.1bug     * @return     */    public static String getServerIp() throws SocketException {        String ip = "";        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {            NetworkInterface anInterface = en.nextElement();            String name = anInterface.getName();            if (!name.contains("docker") && !name.contains("lo")) {                for (Enumeration<InetAddress> enumIpAddr = anInterface.getInetAddresses(); enumIpAddr.hasMoreElements();) {                    //取得IP                    InetAddress inetAddress = enumIpAddr.nextElement();                    if (!inetAddress.isLoopbackAddress()) {                        String ipaddress = inetAddress.getHostAddress().toString();                        if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {                            if(!"127.0.0.1".equals(ip)){                                return ipaddress;                            }                        }                    }                }            }        }        return ip;    }

创立队列

private String IP_ADDRESS = getServerIp();@RabbitListener(queues = IP_ADDRESS)    public void listener(String message) {        System.out.println(message);    }

编译报错 Attribute value must be constant

解决方案

  • 创立队列

    private String IP_ADDRESS = getServerIp(); @Bean  public Queue queue()  {      return new Queue(IP_ADDRESS);  }
  • 应用 #{} 援用 bean 名称

    @RabbitListener(queues= "#{queue.name}")  public void listener(String message) {      System.out.println(message);  }
    #{queue.name} 其中 queuebean 名称,name 是固定。