1. 程式人生 > >Apache Camel繼承Spring Boot 實現檔案遠端複製和轉移

Apache Camel繼承Spring Boot 實現檔案遠端複製和轉移

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>2.18.0</version>
</dependency>

 

配置檔案資訊:

#檔案壓縮本地地址(備份)
ftp.local.backups.dir=file:D:/gz/backups?move=delete&delay=30s
#大資料伺服器地址(備份)
ftp.bigdata.backups.adress=sftp://218.984.130.146:51268/../apps/chinamobile/bigdata/dataConsistencyRepair/backups/?username=root
&password[email protected]&delay=30s #大資料伺服器修復地址(運維存放資料夾,使用後存放到備份檔案中) ftp.bigdatarepair.adress=sftp://218.984.130.146:51268/../apps/chinamobile/bigdata/bigdatarepair/?username=root&password[email protected]&move=/apps/chinamobile/bigdata/bigdatarepair/backups&delay=30s #本地檔案修復地址(複製到自定義資料夾) ftp.local.repair=file:D:/localrepair #對比大資料差異檔案存放地址(通知運維)
ftp.bigdatadifference.adress=sftp://218.984.130.146:51268/../apps/chinamobile/bigdata/difference/?username=root&password[email protected]&delay=30s camel.springboot.main-run-controller=true

 

檔案實現檔案複製,轉移:

/**
 * 遠端檔案監聽和拉取
 */
@Component
public class DownLoadRouteBuilder extends RouteBuilder{

    
private Logger log = Logger.getLogger(DownLoadRouteBuilder.class); /** * 檔案壓縮本地地址 */ @Value("${ftp.local.dir}") private String localFileDir; /** * 大資料伺服器地址 */ @Value("${ftp.bigdata.adress}") private String bigDataServer; /** * 檔案壓縮本地地址(上傳備份) */ @Value("${ftp.local.backups.dir}") private String localFileDirBackups; /** * 大資料伺服器地址(上傳備份) */ @Value("${ftp.bigdata.backups.adress}") private String bigDataBackupsServer; /** * 本地檔案修復地址 */ @Value("${ftp.local.repair}") private String localRepair; /** * 大資料伺服器修復地址 */ @Value("${ftp.bigdatarepair.adress}") private String bigDataRepairServer; /** * 對比大資料差異檔案存放地址 */ @Value("${ftp.bigdatadifference.adress}") private String bigdatadifference; @Override public void configure() throws Exception { //檔案上傳大資料 from(localFileDir).to(bigDataServer).process("transferDataProcessToBigData"); //檔案上傳大資料(上傳備份) 備份檔案不存redis有一份就好 from(localFileDirBackups).to(bigDataBackupsServer).process("transferDataProcessToBigData"); //修復檔案拉取 from(bigDataRepairServer).to(localRepair).process("transferDataProcessBigDataRepairToLocal"); //對比大資料差異檔案存放地址 from(bigdatadifference).to(bigdatadifference).process("transferDataProcessToBigDataDifference"); System.out.println("file download ok..."); log.info("遠端檔案監聽和拉取 已啟動......."); } }

檔案複製獲取資訊:

    檔案遠端複製和移動以後,本物件中可以顯示

檔案一:

/**
 * 監聽本地修復檔案
 */
@Component
public class TransferDataProcessBigDataRepairToLocal implements Processor{

    private Logger log = Logger.getLogger(TransferDataProcessBigDataRepairToLocal.class);

    @Autowired
    private RepairRedisUtil repairRedisUtil;
    /**
     * 本地檔案修復地址
     */
    @Value("${ftp.local.repair}")
    private String localRepair;

    /**
     * redis工具類
     */
    @Autowired
    RedisUtils redisUtils;


    /**
     * 讀取GZ壓縮檔案,多執行緒
     */
    @Autowired
    AsyncService asyncService;

    
    @Override
    public void process(Exchange exchange) throws Exception {
        GenericFileMessage<RandomAccessFile> inFileMessage = (GenericFileMessage<RandomAccessFile>) exchange.getIn();
        String fileName = inFileMessage.getGenericFile().getFileName();//檔名
        String splitTag = File.separator;//系統檔案分隔符
        String absolutePath = localRepair + splitTag + fileName;
        System.out.println(absolutePath);//檔案的絕對路徑
        System.out.println("read file and push to falcon...");

        System.out.println("準備修復檔案!");
        //檔案的絕對路徑去掉:file:
        String filePath = absolutePath.substring(absolutePath.indexOf("file:")+"file:".length());

        //建立redisKey  專案名稱,模組名稱,功能名稱,自定義名稱
        String bigdatarepair = redisUtils.buildRedisKey("OneLink","DataConsistencyRepair","bigdatarepair","list");

        //檔名稱解析並進行redis快取
        DataRepairCacheModel dataRepairModel = repairRedisUtil.getFileInfo(fileName);
        //獲取快取key
        String cacheKey = repairRedisUtil.getDataRepairCacheKey(dataRepairModel.getBusinessCode());
        //檔名稱快取
        repairRedisUtil.CacheRepairData(cacheKey,dataRepairModel,0);

    }
}

檔案二:

/**
 * 監聽大資料伺服器是否上傳成功
 */
@Component
public class TransferDataProcessToBigData implements Processor{

    private Logger log = Logger.getLogger(TransferDataProcessToBigData.class);

    /**
     * redis工具類
     */
    @Autowired
    RedisUtils redisUtils;

    /**
     * 大資料伺服器地址
     */
    @Value("${ftp.bigdata.adress}")
    private String bigDataServer;

    
    @Override
    public void process(Exchange exchange) throws Exception {
        GenericFileMessage<RandomAccessFile> inFileMessage = (GenericFileMessage<RandomAccessFile>) exchange.getIn();
        String fileName = inFileMessage.getGenericFile().getFileName();//檔名
        String splitTag = File.separator;//系統檔案分隔符
        System.out.println(bigDataServer + splitTag + fileName);//檔案的絕對路徑
        System.out.println("read file and push to falcon...");


        //新增:判斷redis是否存在,不存在就刪除,存在就不管

        //建立redisKey  專案名稱,模組名稱,功能名稱,自定義名稱
        String redisName = redisUtils.buildRedisKey("OneLink","DataConsistencyRepair","upload","List");
        //獲取
        Map<String, DataUploadModel> stringObjectMap  = (Map<String, DataUploadModel>) JSON.parseObject((String)redisUtils.get(redisName),Map.class);

        //刪除
        stringObjectMap.remove(fileName);

        //將集合存入快取中
        redisUtils.set(redisName, JSONObject.toJSONString(stringObjectMap));

        log.info("檔案資訊:"+fileName+"上傳大資料伺服器成功!");
        log.info("檔案資訊:"+fileName+"從redis刪除標記!");
    }
}

 

檔案三:

/**
 * 對比大資料差異檔案存放地址監聽
 */
@Component
public class TransferDataProcessToBigDataDifference implements Processor{

    private Logger log = Logger.getLogger(TransferDataProcessToBigDataDifference.class);

    /**
     * redis工具類
     */
    @Autowired
    RedisUtils redisUtils;
@Autowired
private Task task; /** * 對比大資料差異檔案存放地址 */ @Value("${ftp.bigdatadifference.adress}") private String bigdatadifference; @Override public void process(Exchange exchange) throws Exception { GenericFileMessage<RandomAccessFile> inFileMessage = (GenericFileMessage<RandomAccessFile>) exchange.getIn(); String fileName = inFileMessage.getGenericFile().getFileName();//檔名 String splitTag = File.separator;//系統檔案分隔符 System.out.println(bigdatadifference + splitTag + fileName);//檔案的絕對路徑 System.out.println("read file and push to falcon..."); task.send(); System.out.println("給運維傳送郵件!"); } }