一、 任務簡介
建立兩臺Ubuntu虛擬機,部署fourinone。一個主節點一個從節點,從節點監控某文件夾下文件信息,對一天內被修改十次以上的文件進行轉移,轉移到主節點某目錄下。
二、 思路
從節點開啓一個監控線程,每三秒對磁盤進行掃描並監控。監控進程分爲掃描和監控兩部分。掃描是通過遞歸將所有文件及子文件夾下的文件的最後修改時間記錄到hashmap中。監控是遞歸對文件的最後修改時間和hashmap中的信息進行對比,不一致說明文件被修改,此時用另一個hashmap記錄修改次數。判斷修改次數,若大於10則將此文件的對象保存到set中,最後遍歷此set,將裏面的文件複製到主節點後刪除此文件。利用掃描方法進行計時,每當超過一天修改次數歸零。
三、 代碼
ParkServerDemo.java
import com.fourinone.BeanContext; //開啓服務 public class ParkServerDemo { public static void main(String[] args) { BeanContext.startPark(); } }
FttpServer.java
import com.fourinone.BeanContext; //啓動存儲節點 public class FttpServer { public static void main(String[] args) { BeanContext.startFttpServer("192.168.100.10"); } }
Monitoer.java
import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.fourinone.FttpAdapter; import com.fourinone.FttpException; import com.fourinone.FttpAdapter.FileProperty; //對本機某文件夾進行監控 public class Monitor { //記錄監控開始時間 static Date start=new Date(); //記錄所有文件最後修改時間 static Map<String,Long> map=new HashMap<String,Long>(); //記錄修改次數 static Map<String,Integer> changeCount=new HashMap<String,Integer>(); //記錄要移動的對象 static Set<FttpAdapter> cpy=new HashSet<FttpAdapter>(); //遞歸掃描某文件夾下所有文件並記錄修改時間 public static void scan(FileProperty prop){ Date end=new Date(); if((end.getTime()-start.getTime())>86400000){ for(String k:changeCount.keySet()){ changeCount.put(k, 0); start=new Date(); } } if(prop!=null){ if(prop.isFile()&&!map.containsKey(prop.getName())){ map.put(prop.getName(),prop.lastModifiedDate().getTime()); changeCount.put(prop.getName(),0); } if(prop.isDirectory()){ FileProperty[] fp=getProperty(prop.getPath()); if(fp!=null){ for(int i=0;i<fp.length;i++){ scan(fp[i]); } } } } else{ System.out.println("scan empty"); } } //獲取某文件夾下所有子類 public static FileProperty[] getProperty(String path){ FttpAdapter dir; try { dir = new FttpAdapter(path); return dir.getChildProperty(); } catch (FttpException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //記錄修改次數 public void change(FileProperty prop){ if(prop!=null){ if(prop.isFile()&&changeCount.containsKey(prop.getName())){ if(map.get(prop.getName())<prop.lastModifiedDate().getTime()){ int num=changeCount.get(prop.getName())+1; changeCount.put(prop.getName(),num); System.out.println(num); map.put(prop.getName(), prop.lastModifiedDate().getTime()); if(changeCount.get(prop.getName())>=2){ try { cpy.add(new FttpAdapter(prop.getParent(),prop.getName())); changeCount.put(prop.getName(),0); } catch (FttpException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } if(prop.isDirectory()){ FileProperty[] fp=getProperty(prop.getPath()); if(fp!=null){ for(int i=0;i<fp.length;i++){ change(fp[i]); } } } } else{ System.out.println("change empty"); } } }
Test.java
import com.fourinone.FttpAdapter; import com.fourinone.FttpAdapter.FttpWriteAdapter; import com.fourinone.FttpException; import com.fourinone.FttpAdapter.FileProperty; //線程對象,循環進行監控及相應動作 class FttpOperateDemo implements Runnable{ Monitor monitor=new Monitor(); //創建要監控的對象 static FttpAdapter dir = null; static FileProperty dirProp = null; //創建對象副本,爲了對修改信息進行比較 static FttpAdapter dircompare = null; static FileProperty dirPropcompare = null; public void run() { FttpAdapter f1=null; while(true){ //3秒掃面一次 try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //監控fttp://192.168.100.10/home/jobs/1/及其子目錄下的所有文件 try { dir=new FttpAdapter("fttp://192.168.100.10/home/jobs/1/"); dirProp = dir.getProperty(); dircompare=new FttpAdapter("fttp://192.168.100.10/home/jobs/1/"); dirPropcompare = dircompare.getProperty(); } catch (FttpException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //掃面和監控 monitor.scan(dirProp); monitor.change(dirPropcompare); //循環複製移動要移動的文件 if(monitor.cpy!=null){ for(FttpAdapter ad : monitor.cpy){ try { System.out.println(); f1=new FttpAdapter("fttp://192.168.100.11/home/jobs/1/"+ad.getProperty().getName()); f1.createFile(); FttpWriteAdapter fwa=f1.getFttpWriter(0,ad.getFttpReader().readAll().length); fwa.write(ad.getFttpReader().readAll()); ad.delete(); monitor.cpy.remove(ad); System.out.println("copy success"); } catch (FttpException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } public class Test{ public static void main(String[] args){ Runnable fttpOperateDemo=new FttpOperateDemo(); Thread t=new Thread(fttpOperateDemo); t.start(); } }