Java服务_读取properties配置文件

Java服务_读取properties配置文件

1.使用背景

为了减少参数与程序的耦合,我们有时将经常改变的参数以properties配置文件的形式来进行配置,在主程序运行之前进行配置文件的读取。其实归根结底就是因为——优雅!

2.使用方法

2.1创建properties配置文件

在java项目的resource文件夹下创建TargetField.properties配置文件。

1
targetField=logMsg,param,logType,uuid,indexFreq,queryType,hitCache,indicators,attributes,dimension,group,aggrPath,lvl,querySt,queryEt,dtRange,dtIn,timeInterval,clusterType,clusterName,dbName,tableName,startTime,endTime,cost,resAppkey,error,errorType,SQL,authorityType,appkey,serviceId

2.2创建配置类

提前设计好要读取哪些参数,在配置类中创建对应的装载属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

public class TargetFieldConf {
//饿汉单例模式
private static TargetFieldConf targetFieldConf;

private static Properties targetFieldProperties = new Properties();

private Set<String> targetField;

public static TargetFieldConf getConf() {
if (targetFieldConf == null) {
targetFieldConf = new TargetFieldConf();
}
return targetFieldConf;
}

//在构造方法中读取配置文件并解析目标参数
private TargetFieldConf() {
try {
InputStream is = TargetFieldConf.class.getResourceAsStream("/TargetField.properties");
targetFieldProperties.load(is);
System.out.println("TargetField.properties load successed.");

String targetFieldString = targetFieldProperties.getProperty("targetField");
String[] strings = targetFieldString.split(",");
targetField = new HashSet<>();
targetField.addAll(Arrays.asList(strings));
} catch (IOException e) {
e.printStackTrace();
System.out.println("TargetField.properties load failed.");
}
}

public Set<String> getTargetField() {
return targetField;
}
}

2.3在需要使用配置参数的类中使用

判断相应的属性是不是在一个类的多个实例中都要使用同一份数据,以此来判断是不是设置为静态属性。此处从配置文件中获取到的参数就可以设置为静态属性,减少内存浪费。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class LogResolveFlatMapFunction implements FlatMapFunction<String, String> {

//需要从日志中提取的字段列表
private final static Set<String> targetField = TargetFieldConf.getConf().getTargetField();

//存储解析得到的字段键值对
private Map<String, Object> map = new HashMap<>();

//存储一行日志拆分输出的多行数据
private List<String> list = new LinkedList<>();

private final static String MSG = "msg";
private final static String LOGMSGKEY = "logMsg";
private final static String OUTPARAM = "param=";
private final static String SEPARATOR = ",";

@Override
public void flatMap(String value, Collector<String> out) {
parseLog(value);
for (String string : list) {
out.collect(string);
}
}

/**
* 日志解析
*/
private void parseLog(String log) {
String paramOut = getLogMsg(log);
JSONObject paramOutObject = JSONObject.parseObject(paramOut);
getKV(paramOutObject);
list.add(JSONObject.toJSONString(map));
}

/**
* 从JSONObject对象中获取目标键值对
*/
private void getKV(JSONObject jsonObject) {
Iterator<String> iterator = jsonObject.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (targetField.contains(key)) {
map.put(key, jsonObject.get(key));
}
}
}

/**
* 获取额外日志信息,如"2022-09-25 18:05:05.736 633027d19e66e wangning354 1484097.46838.16641003056574141 INFO 638 --- [JSF-BZ-22000-13-T-19] bizAnalysisLog[intercept[55]] : part log. "
*/
private String getLogMsg(String log) {
JSONObject logObject = JSONObject.parseObject(log);
String msg = logObject.getString(MSG);
map.put(LOGMSGKEY, msg.substring(0, msg.indexOf(OUTPARAM)));
return msg.substring(msg.indexOf(OUTPARAM) + 6);
}
}

重要:编写java代码最重要的就是优雅,绝对不要让我看见主程序代码段中出现字符串,一定要写成静态不可变属性的形式。