private static void ServerSync() throws RemoteException { String userPattern = localServer.getRmiSettings().getProperty("userdatapath"); String metaPattern = localServer.getRmiSettings().getProperty("metadatapath"); String destFilePath = userPattern.replace("$ftpuser", remoteServer.getFTPUser()); String metaFolder = metaPattern.replace("$ftpuser", remoteServer.getFTPUser()); String userListFileName = metaFolder + localServer.getRmiSettings().getProperty("userlistfile"); String accountManagerFileName = metaFolder + localServer.getRmiSettings().getProperty("amfile"); String serverFileMatrixFileName = metaFolder + localServer.getRmiSettings().getProperty("sfmfile"); int refreshInterval = clientModeConnection.getRefreshInterval(); final int MAX_THREADS = 99; // thread pool to optimize the resouce String serverID = selfName; SFTP sftp = new SFTP(remoteServer.getIP(), remoteServer.getFTPUser(), remoteServer, destFilePath); ArrayList<String> downloadList = new ArrayList<>(); // Create metadata folder FileOperation.createFolder(metaFolder); // Create users folder FileOperation.createFolder(destFilePath); ExecutorService pool = Executors.newFixedThreadPool(MAX_THREADS); while (true) { try { Thread.sleep(refreshInterval * 1000); } catch (InterruptedException ex) { } System.out.println("Sync..."); AccountManager am = remoteServer.getAccountManager(); Properties userlist = remoteServer.getUserList(); Properties serverlist = remoteServer.getServerList(); FileDeviceMatrix matrix = remoteServer.getServerMatrix(); FileOperation.save(am, accountManagerFileName); FileOperation.save(matrix, serverFileMatrixFileName); try { PropertyHandler.saveAbs(userListFileName, userlist); } catch (Exception ex1) { System.out.println("save userList failed!"); } try { PropertyHandler.save(SERVER_LIST_FILE, serverlist); } catch (Exception ex1) { System.out.println("save userList failed!"); } System.out.println("ServerSync for: " + serverID + "\n" + matrix); for (FileDeviceList node : matrix.getMatrix()) { if (!node.getServerNode(serverID).getUpdated().equals(DeviceInfoNode.Updated.TRUE)) { if (am.getAccountByUser(node.getUserName()) .getFileList() .findFile(node.getFileName()) .getState() .equals(FileAttr.State.DELETE)) { FileOperation.deleteFile( remoteServer.getDestFolder(node.getUserName(), false) + node.getFileName()); remoteServer.setSelfTrueByServer(node.getUserName(), serverID, node.getFileName()); remoteServer.removeNodeIfAllT(node.getUserName(), node.getFileName()); } else { FileOperation.createFolder(remoteServer.getDestFolder(node.getUserName(), true)); pool.execute( new ServerDownload( sftp, node.getUserName(), node.getFileName(), remoteServer.getDestFolder(node.getUserName(), true), serverID, downloadList, remoteServer)); } } } } }