前言
前几天遇到一个需求,那就是mq队列的名称要跟本机的ip地址相关,由于用的是spring的stream模块来进行连接mq的,所以不能通过代码来指定队列的名称(只是我不知道怎么通过代码指定而已…逃),这可把我急坏了,因为队列名称是通过yml配置文件来的,于是我就想能不能再配置文件上面做点文章.
查资料
通过查询spring的yml相关资料,找到了生成随机数和uuid的办法(虽然之前我都知道了,无奈),显然是不符合我们需求的,在看spring官方文档的过程中,发现yml是可以读取环境变量的.这感觉不错,但是服务器上面有关于本机ip地址的环境变量吗??有没有我是不知道的.于是产生了手动设置环境变量的想法.
实现思路
只要在spring读取配置文件之前,把环境变量设置好就可以了.
实现思路
代码如下:
public static void main(String[] args) {
//获取本地ip地址
InetAddress address = getAddress();
if (address == null) {
//设置环境变量
System.setProperty("local.ip","127.0.0.1");
}else{
//设置环境变量
System.setProperty("local.ip",address.getHostAddress());
}
SpringApplication.run(StreamApplication.class, args);
}
//获取本机ip地址
private static InetAddress getAddress() {
try {
for (Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements();) {
NetworkInterface networkInterface = interfaces.nextElement();
if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
continue;
}
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
if (addresses.hasMoreElements()) {
return addresses.nextElement();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return null;
}
yml配置如下
spring:
application:
name: zzwtec-stream
cloud:
stream:
bindings:
log_data_channel:
destination: mq_sys_log_data
contentType: application/json
group: sysLogData
log_status_channel:
destination: mq_sys_log_data
contentType: application/json
group: ${local.ip} #获取名称为local.ip的环境变量
data_into_redis_channel:
destination: mq_stream_data
contentType: application/json
group: streamIntoRedis
data_into_database_channel:
destination: mq_stream_data
contentType: application/json
group: streamIntoDatabase
总结
通过以上的方式yml就可以获取本地ip地址了,哎,还是对spring这个框架不太熟悉呀,之前我居然不知道还可以读取环境变量.emmmmmmm还要多学学,不然跟不上历史的进程.