我正在开发一个应用程序,其中我有机器列表,每个机器我需要点击URL,这将给我回复XML,我需要解析XML并提取一个字段(dataKey是字段name)每个服务器的值,然后检查该字段值是否与我的阈值匹配。如果它连续三次匹配我的阈值,则将该服务器添加到另一个列表中。
因此,如果machineA
dataKey
字段连续三次匹配我的阈值,则将machineA
添加到我的列表中,如果我的machineB
dataKey
字段value也连续三次匹配我的相同thresold值,然后将machineB
添加到同一列表中。
将机器添加到列表后,重置计数器并重新启动。
以下是我的MachineStats
课程,其中包含每台机器信息 -
public class MachineStats {
private String serverName;
private String serverURL;
private int dataKey = 0;
public MachineStats(String serverName, String serverURL) {
this.serverName = serverName;
this.serverURL = serverURL;
}
// getters here
public boolean isEligibleForEmail(Integer dataKeyCount, int thresholdLimit) {
try {
if (!TestUtils.isEmpty(dataKeyCount)) {
if (dataKeyCount >= thresholdLimit) {
dataKey++;
} else {
dataKey = 0;
}
if (dataKey > 3) {
dataKey = 0;
return true;
}
return false;
} else {
return false;
}
} catch (NumberFormatException ex) {
// log an exception
return false;
}
}
}
以下是我在main方法中的代码,它是serverList
保存机器列表的起点。
// this holds machineA and machineB information
private static List<MachineStats> serverList = new LinkedList<MachineStats>();
while(true) {
ServerMetricsTask task = new ServerMetricsTask(serverList, thresholdLimit);
task.run();
TimeUnit.MINUTES.sleep(2); // sleep for 2 minutes
}
以下是我的ServerMetricsTask
课程 -
public class ServerMetricsTask {
private List<MachineStats> listOfServers;
private int thresholdLimit;
public ServerMetricsTask(List<MachineStats> listOfServers, int thresholdLimit) {
this.listOfServers = listOfServers;
this.thresholdLimit = thresholdLimit;
}
public void run() {
try {
List<String> holder = new LinkedList<String>();
for (MachineStats stats : listOfServers) {
Integer dataKeyCount = TestUtils.extractKey(stats.getServerName(), stats.getServerURL());
if (stats.isEligibleForEmail(dataKeyCount, thresholdLimit)) {
holder.add(stats.getServerName());
}
}
if (!holder.isEmpty()) {
// send an email with the machine name which has met the threshold
}
} catch (Exception ex) {
// log an exception
}
}
}
问题陈述: -
现在我上面的代码工作正常。截至目前,我只检查每个服务器dataKey
的一个属性。现在我需要为每个服务器的两个字段做同样的事情。一个字段为dataKey
,第二个字段为customerKey
,这两个字段将出现在每个服务器的XML响应中。
所以我有一个fieldHolder
地图,其中包含我需要检查的字段名称。
此处fieldHolder
地图成立 -
key - field which we want to extract from the response coming from the URL.
value - is the threshold for that field which is a key.
现在我修改了我的代码 -
// this holds machineA and machineB information
private static List<MachineStats> serverList = new LinkedList<MachineStats>();
private static Map<String, String> fieldHolder;
while(true) {
ServerMetricsTask task = new ServerMetricsTask(serverList, fieldHolder);
task.run();
TimeUnit.MINUTES.sleep(2); // sleep for 2 minutes
}
以下是我的ServerMetricsTask
课程 -
public class ServerMetricsTask {
private List<MachineStats> listOfServers;
private int thresholdLimit;
public ServerMetricsTask(List<MachineStats> listOfServers, Map<String, String> fieldHolder) {
this.listOfServers = listOfServers;
this.fieldHolder = fieldHolder;
}
public void run() {
try {
List<String> holder = new LinkedList<String>();
for (MachineStats stats : listOfServers) {
//now what should I do here?
// I guess I need to iterate fieldHolder map
}
if (!holder.isEmpty()) {
// send an email with the machine name which has met the threshold
}
} catch (Exception ex) {
// log an exception
}
}
}
我面临的唯一问题是我不应该如何添加逻辑以便它可以在迭代fieldHolder
映射后通过执行URL来提取两个字段值,然后还检查这两个字段是否或者其中任何一个连续三次达到阈值限制。如果他们连续三次达到阈值限制,则将该机器名称添加到列表持有者。
我已经知道如何通过解析XML响应来提取给定URL的那些字段值。
答案 0 :(得分:0)
首先,将MachineStats中的dataKey更改为keyMap
public class MachineStats {
...
private HashMap<String,int> keyMap = new HashMap<String,int>;
...
public HashMap<String,int> getKeyMap() {
return this.keyMap;
}
}
每次创建新的MachineStats时,都需要使用所需的键填充其keyMap。
keyMap.put("Key1", 0);
keyMap.put("Key2", 0);
// etc. I don't know how you will do it
现在,您需要更改TestUtils.extractKey()
,以便它接受并提取任意键名。与我在评论中所说的相反,最好不要改变其内在逻辑,以便我们不会在那里做出任何更改。
TestUtils.extractKey(String keyName, String serverName, string serverURL);
现在,ServerMetricsTask迭代机器列表,并迭代机器的键映射:
public class ServerMetricsTask {
...
for (MachineStats stats : listOfServers) {
//now what should I do here?
// I guess I need to iterate fieldHolder map
HashMap<String, int> keymap = stats.getKeyMap();
int key_count = keymap.size();
int valid_count = 0;
Set<String> keys = keymap.keySet();
for (String key : keys) {
int count = keymap.get(key);
int result = TestUtils.extractKey(key, stats.getServerName(), stats.getServerURL());
if (stats.isEligibleForEmail(result, thresholdLimit)) {
count++;
} else {
// here you can do count = 0 if you need strictly continuous appearance of the key
}
keymap.put(key, count);
if (count >= 3) valid_count++;
}
// now decide if you need all keys to be valid or just some
if (valid_count == key_count) holder.add(stats.getServerName());
...