package com.basic.security.manager;
|
|
import android.os.SystemClock;
|
import android.text.TextUtils;
|
|
import com.basic.security.activity.MainActivity;
|
import com.basic.security.base.BaseApplication;
|
import com.basic.security.model.Cluster;
|
import com.basic.security.model.ModelAdapter;
|
import com.basic.security.model.Node;
|
import com.google.gson.Gson;
|
import com.google.gson.reflect.TypeToken;
|
|
import java.lang.reflect.Type;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Comparator;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.PriorityQueue;
|
import java.util.Queue;
|
|
import androidSync.AndroidSync;
|
|
public class ClusterSerfSyncManager {
|
public static final Object serfQueueLock = new Object();
|
public static final Object serfReceiveQueueLock = new Object();
|
public static final Object serfSendQueueLock = new Object();
|
public static Queue<String> serfQueue = new PriorityQueue<>();
|
public static List<String> serfReceiveQueue = new ArrayList<>();
|
public static List<String> serfReceiveQueueCopy = new ArrayList<>();
|
public static List<String> serfSendQueueCopy = new ArrayList<>();
|
public static List<String> serfSendQueue = new ArrayList<>();
|
public static Comparator<Map<String, String>> mapComparator = (m1, m2) -> {
|
try {
|
return m1.get(Node.nodeID).compareTo(m2.get(Node.nodeID));
|
} catch (Exception e) {
|
return 0;
|
}
|
};
|
static int count = 0;
|
static boolean started = false;
|
static boolean prevStarted = false;
|
static Map<String, Map<String, String>> prevNodeIdNodeMap = new HashMap<>();
|
|
public static void start() {
|
started = false;
|
prevStarted = false;
|
|
BaseApplication.getApplication().executorService.execute(() -> {
|
boolean fromTimeOut = false;
|
MainActivity mainActivity = BaseApplication.getApplication().activity;
|
while (true) {
|
try {
|
ModelAdapter cluster = ClusterManager.cluster;
|
if (cluster.getBool(Cluster.exit)) {
|
if (mainActivity.currentFragment == mainActivity.fragment_cluster) {
|
BaseApplication.getApplication().activity.fragment_cluster.updateDeviceList(new ArrayList<>());
|
}
|
prevNodeIdNodeMap.clear();
|
started = false;
|
AndroidSync.leave();
|
}
|
prevStarted = started;
|
if (!cluster.getBool(Cluster.exit) && !fromTimeOut) {
|
String localNodeId = ClusterManager.getLocalNodeId();
|
String clusterName = ClusterManager.getClusterName();
|
String password = ClusterManager.getPassword();
|
if (
|
!TextUtils.isEmpty(localNodeId) &&
|
!TextUtils.isEmpty(clusterName) &&
|
!TextUtils.isEmpty(password)
|
) {
|
AndroidSync.leave();
|
AndroidSync.registerReceiveSqlInterfaceFromJava(ClusterSerfSyncManager::receiveData);
|
AndroidSync.initCluster();
|
AndroidSync.initAgent(localNodeId);
|
AndroidSync.syncInit(clusterName, password, localNodeId, "");
|
System.out.println("ClusterSerfSyncManager.start 3 " + cluster.getBool(Cluster.exit));
|
started = true;
|
}
|
|
}
|
if (started) {
|
String otherNodeIp = ClusterManager.getOtherNodeIp();
|
if (!TextUtils.isEmpty(otherNodeIp)) {
|
// AndroidSync.joinByNodeAddrs(otherNodeIp + ":30190");
|
}
|
String nodesStr = new String(AndroidSync.getNodes());
|
List<Map<String, String>> availableNodes = new ArrayList<>();
|
try {
|
Gson gson = new Gson();
|
Type typeOfListOfTypeX = new TypeToken<List<Map<String, String>>>() {
|
}.getType();
|
List<Map<String, String>> nodes = gson.fromJson(nodesStr, typeOfListOfTypeX);
|
for (Map<String, String> node : nodes) {
|
if ("1".equals(node.get("isAlive"))) {
|
availableNodes.add(node);
|
}
|
}
|
if (mainActivity.currentFragment == mainActivity.fragment_cluster) {
|
Collections.sort(availableNodes, mapComparator);
|
BaseApplication.getApplication().activity.fragment_cluster.updateDeviceList(availableNodes);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
if (availableNodes.size() <= 1) {
|
otherNodeIp = ClusterManager.getOtherNodeIp();
|
if (!TextUtils.isEmpty(otherNodeIp)) {
|
AndroidSync.joinByNodeAddrs(otherNodeIp + ":30190");
|
}
|
}
|
|
try {
|
synchronized (serfSendQueueLock) {
|
if (serfSendQueue.size() == 0) {
|
serfSendQueueLock.wait(3 * 1000);
|
}
|
if (serfSendQueue.size() > 0) {
|
serfSendQueueCopy.addAll(serfSendQueue);
|
serfSendQueue.clear();
|
}
|
}
|
for (String serfSendCopy : serfSendQueueCopy) {
|
System.out.println("ClusterSerfSyncManager.start serfSendCopy=" + serfSendCopy);
|
}
|
serfSendQueueCopy.clear();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
if (prevStarted != started) {
|
SystemClock.sleep(5 * 1000);
|
}
|
count++;
|
}
|
synchronized (serfQueueLock) {
|
if (serfQueue.peek() == null) {
|
serfQueueLock.wait(3 * 1000);
|
}
|
if (serfQueue.size() > 0) {
|
serfQueue.remove();
|
fromTimeOut = false;
|
} else {
|
fromTimeOut = true;
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
});
|
BaseApplication.getApplication().executorService.execute(() -> {
|
while (true) {
|
sendData("select * from table1 count=" + count + ", node=node3");
|
SystemClock.sleep(4 * 1000);
|
}
|
});
|
BaseApplication.getApplication().executorService.execute(() -> {
|
while (true) {
|
try {
|
synchronized (serfReceiveQueueLock) {
|
if (serfReceiveQueue.size() == 0) {
|
serfReceiveQueueLock.wait(3 * 1000);
|
}
|
if (serfReceiveQueue.size() > 0) {
|
serfReceiveQueueCopy.addAll(serfReceiveQueue);
|
serfReceiveQueue.clear();
|
}
|
}
|
for (String serfReceiveCopy : serfReceiveQueueCopy) {
|
System.out.println("ClusterSerfSyncManager.start serfReceiveCopy=" + serfReceiveCopy);
|
}
|
serfReceiveQueueCopy.clear();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
});
|
}
|
|
|
private static void receiveData(String content) {
|
try {
|
synchronized (serfReceiveQueueLock) {
|
serfReceiveQueue.add(content);
|
serfReceiveQueueLock.notify();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
public static void sendData(String content) {
|
try {
|
synchronized (serfSendQueueLock) {
|
serfSendQueue.add(content);
|
serfSendQueueLock.notify();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
}
|