RabbbitMQ RabbitListener使用IP动态队列 Attribute value must be constant
在
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}
其中queue
是bean
名称,name
是固定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?