Я работаю над проектом, в котором у меня есть три центра обработки данных - DC1
, DC2
и DC3
.
В DC1
меня есть 2 машины (machineA and machineB)
, в DC2
у меня две машины (machineC and machineD)
(machineA and machineB)
, а в DC3
у меня две машины снова (machineE and machineF)
.
Каждый URL-адрес машины в каждом центре данных подобен этому, и он возвращает обратно строку в качестве ответа -
http://machineName:8080/textbeat
Для DC1-
http://machineA:8080/textbeat
http://machineB:8080/textbeat
Для DC2-
http://machineC:8080/textbeat
http://machineD:8080/textbeat
Для DC3-
http://machineE:8080/textbeat
http://machineF:8080/textbeat
Вот строка ответа, которую я вижу в целом после попадания URL-адреса для какой-либо конкретной машины -
state: READY server_uptime: 12462125 data_syncs: 29
Постановка задачи:-
Теперь мне нужно выполнить итерацию всех машин в каждом датацентре и выполнить URL-адрес, а затем извлечь из него data_syncs
. И это нужно делать каждые 1 минуту.
А теперь, если machineA
data_syncs
всегда равен нулю непрерывно в течение 5 минут, то я хотел бы напечатать DC1
и machineA
. Точно так же для machineB и других датацентров.
Логика, о которой я думал,
data_syncs
если оно равно нулю, увеличивайте счетчик на единицу,Ниже приведена моя карта, в которой я помещаю центр обработки данных и его машины, если они удовлетворяют вышеуказанному условию -
final Map<String, List<String>> holder = new LinkedHashMap<String, List<String>>();
Здесь ключ - это имя центра данных, а значение - это список машин для этого центра обработки данных, который удовлетворяет условию.
Ниже приведен код, который я придумал для решения вышеуказанной проблемы, но он не работает так, как я предполагаю. Здесь мой counter
одинаковый для всех машин, которые, как я думаю, не то, что я хочу.
public class MachineTest {
private static int counter = 0;
private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
public static void main(String[] args) {
final ScheduledFuture<?> taskUtility = scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
generalUtility();
} catch (Exception ex) {
// log an exception
}
}
}, 0, 1L, TimeUnit.MINUTES);
}
protected static void generalUtility() {
try {
final Map<String, List<String>> holder = new LinkedHashMap<String, List<String>>();
List<String> datacenters = Arrays.asList("DC1", "DC2", "DC3");
for (String datacenter : datacenters) {
LinkedList<String> machines = new LinkedList<String>();
List<String> childrenInEachDatacenter = getMachinesInEachDatacenter(datacenter);
for (String hosts : childrenInEachDatacenter) {
String host_name = hosts;
String url = "http://" + host_name + ":8080/textbeat";
MachineMetrics metrics = GeneralUtilities.getMetricsOfMachine(host_name, url); // execute the url and populate the MachineMetrics object
if (metrics.getDataSyncs().equalsIgnoreCase("0")) {
counter++;
if (counter == 5) {
machines.add(hosts);
}
}
}
if(!machines.isEmpty()) {
holder.put(datacenter, machines);
}
}
if (!holder.isEmpty()) {
// log the datacenter and its machine as our criteria is met
System.out.println(holder);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Below method will return list of machines given the name of datacenter
private static List<String> getMachinesInEachDatacenter(String datacenter) {
// this will return list of machines for a given datacenter
}
}
И вот мой класс MachineMetrics
-
public class MachineMetrics {
private String machineName;
private String dataSyncs;
// getters and setters
}
Возможно ли это сделать с помощью ScheduledExecutorService, поскольку это не одноразовый процесс? Это необходимо сделать повторно
В основном для каждой машины, если data_syncs
равно 0 в течение 5 minutes
непрерывно, тогда мне нужно зарегистрировать этот центр обработки данных и его машины.
public class Machine{
private String dataCenter;
private String machineName;
private String hostname;
private int zeroCount = 0;
//getters setters, except for zeroCount
// constructor with datacenter,machine as args
private boolean isEligibleForLogging(String dataSyncs){
if(dataSyncs.equals("0")){
zeroCount++;
}else{
zeroCount = 0;
}
if(zeroCount > 5){
zeroCount = 0;
return true;
}
return false;
}
}
static List<Machine> machines = new ArrayList<Machine>();
static{
Machine machine1 = new Machine("DC1", "name1","hostname1");
machines.add(machine1);
//repeat the above two lines per each machine.
}
protected static void generalUtility() {
try {
for (Machine machine : machines) {
String host_name = machine.getHostName();
String url = "http://" + host_name + ":8080/textbeat";
String dataSyncs = //execute url and get datasyncs
if(machine.isEligibleForLogging()){
System.out.println(machine.getName() + ... +machine.getDataCenter() + ... + dataSyncs......);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
dataSyncs
переменнаяdataSyncs
вашем классе Machine? Во-вторых, что произойдет в этой ситуации - предположим, что впервыеdataSyncs
былzero
для конкретной машины, поэтому zeroCount будет равен1
но в следующий раз он не будет равен нулю, тогда все равно будет один для этой машины. Если да, то я думаю, что это не то, что мне нужно, это должно быть 5 попыток.