1. 程式人生 > >基於Fourinone實現檔案監控

基於Fourinone實現檔案監控

一、    任務簡介

建立兩臺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();
      }
}