閱讀827 返回首頁    go 阿裏雲


Java SDK實例程序__最佳實踐_歸檔存儲-阿裏雲

AliyunOASClient和ArchiveManager

AliyunOASClient和ArchiveManager分別是低階接口、高級接口的入口對象,在每個功能中都會使用到它們,為避免實例程序的冗長,將AliyunOASClient和ArchiveManager的創建在這裏單獨介紹。

注:在本文檔中出現的 aliyunOASClient 均是 AliyunOASClient 實例,archiveManager 均是 ArchiveManager實例

AliyunOASClient實例化

// AccessId和AccessKey配置
ServiceCredentials credentials = new ServiceCredentials(
    "[yourAccessId]", "[yourAccessKey]");
// 配置客戶端設置
ClientConfiguration clientConf = new ClientConfiguration();
// 指定要連接的服務地址
ServiceHost serviceHost = new ServiceHost("https://cn-hangzhou.oas.aliyuncs.com");

// 用OAS工廠獲得AliyunOASClient對象
AliyunOASClient aliyunOASClient = OASFactory.aliyunOASClientFactory(
    serviceHost, credentials, clientConf);
// 或者像下麵這樣,通過ServiceCredentials和url直接創建AliyunOASClient對象
AliyunOASClient aliyunOASClient = OASFactory.aliyunOASClientFactory(
    credentials, "https://cn-hangzhou.oas.aliyuncs.com");

ArchiveManager實例化

// 使用默認配置
ServiceCredentials credentials = new ServiceCredentials("[yourAccessKeyID]", "[yourAccessKeySecret]");

ArchiveManager manager = OASFactory.archiveManagerFactory(
    credentials, "https://cn-hangzhou.oas.aliyuncs.com");
// 自定義配置ClientConfiguration
ServiceCredentials credentials = new ServiceCredentials("[yourAccessKeyID]", "[yourAccessKeySecret]");
// 指定要連接的服務地址
ServiceHost serviceHost = new ServiceHost("https://cn-hangzhou.oas.aliyuncs.com");
// 配置客戶端設置
ClientConfiguration clientConf = new ClientConfiguration();

ArchiveManager archiveManager = new ArchiveManager(serviceHost, credentials, clientConf);
// 使用AliyunOASClient初始化
AliyunOASClient aliyunOASClient = OASFactory.aliyunOASClientFactory(
    credentials, clientConf).withLogger();
ArchiveManager archiveManager = OASFactory.archiveManagerFactory(aliyunOASClient);

Vault操作

創建Vault

  • 如果指定名稱的Vault不存在,則創建Vault;
  • 如果指定名稱的Vault已存在,不執行創建動作,返回Vault的信息。
// vaultName必須滿足已下2個條件:
// 1. 總長度在3~63之間(包括3和63);
// 2. 隻允許包含以下字符:
//    0-9(數字),
//    a-z(小寫英文字母),
//    -(短橫線),
//    _(下劃線)
// 其中 短橫線 和 下劃線 不能作為vaultName的開頭和結尾;
String vaultName = "oas_demo";

// 發送創建vault請求
// 創建Vault的名稱,用CreateVaultRequest來指定
CreateVaultRequest createRequest = new CreateVaultRequest().
    withVaultName(vaultName);

// 發起創建Vault的請求
// 如果有同名的vault存在,OAS會返回已有的vault的vaultId,而不會執行創建動作
try {
    CreateVaultResult result = aliyunOASClient.createVault(createRequest);
    logger.info("Vault created vaultId={}", result.getVaultId());
    logger.info("Vault created vaultLocation={}", result.getLocation());
} catch (OASClientException e) {
    logger.error("OASClientException Occured:", e);
} catch (OASServerException e) {
    logger.error("OASServerException Occured:", e);
}

刪除Vault

// 刪除vault是高危動作,因此隻能通過vaultId來刪除
DeleteVaultRequest deleteVaultRequest = new DeleteVaultRequest().withVaultId(yourVaultId);

try {
    OASResult result = aliyunOASClient.deleteVault(deleteVaultRequest);
    logger.info("Delete Success! {} {}", result.getRequestId(), result.getDate());
} catch (OASClientException e) {
    logger.error("OASClientException Occured:", e);
} catch (OASServerException e) {
    logger.error("OASServerException Occured:", e);
}

上傳Archive

快速上傳

  • ArchiveManager的upload接口會根據文件大小判斷是直接上傳還是用Multipart上傳,無須用戶選擇

關於高級接口ArchiveManager的詳細文檔,參考 OAS Java SDK高級接口文檔

// java sdk 會幫助用戶完成 vaultName 到 vaultId 的轉換
// 由此避免了用戶對一長串vaultId的記憶負擔
String yourVaultName = "oas_demo";
File file = new File("oas_demo_data/random10M.bin");
try {
    UploadResult uploadResult = archiveManager.upload(yourVaultName, file);
    logger.info("File {} uploaded complete. ArchiveId={},md5={},treeEtag={}",
        file.getAbsolutePath(), uploadResult.getArchiveId(),
        uploadResult.getHashValue(),
        uploadResult.getHashTreeValue());
} catch (OASClientException e) {
    logger.error("OASClientException Occured:", e);
} catch (OASServerException e) {
    logger.error("OASServerException Occured:", e);
}

根據UploadId上傳

File file = new File("oas_demo_data/random120M-2.bin");
//獲得uploadId
//文件大小必須大於100MB,否則會拋異常提示用普通上傳接口進行上傳
String uploadId = archiveManager.initiateMultipartUpload(vaultName, file, "Hello OAS!");
//如果是已有的uploadId,直接使用之前獲取過的uploadId
//String uploadId = "[yourUploadId]";
System.out.println("Get uploadArchive 任務執行">任務執行

下載任務是通過提交任務、下載任務輸出的異步過程執行的,任務的詳細介紹,參考 OAS Java SDK高級接口文檔

提交提檔任務

String yourVaultName = "oas_demo";
String yourArchiveId = "6086C62DBFFD4A68BAEE9D1B680EC77C8FE6AE617FF47BCD3DB3CB71AFAE29B33431AED14D06D9C4AD251F17C173F3CD";
JobMonitor jobMonitor = archiveManager.downloadAsync(yourVaultName, yourArchiveId);

執行Inventory

JobMonitor jobMonitor = archiveManager.downloadInventoryAsync("oas_demo");

下載Job輸出

archiveManager.downloadJobOutput(yourVaultName, jobId,
    new File("oas_demo_data/mySaveFile.bin"));

配置ProcessListener

以上傳Archive為例:

ServiceCredentials credentials = new ServiceCredentials(
    DemoConstants.ACCESS_ID,
    DemoConstants.ACCESS_KEY);

// 通過工廠類獲得archiveManager接口
ArchiveManager archiveManager = OASFactory.archiveManagerFactory(credentials);
File file = new File("[pathToYourFile]");

final BaseTransfer<UploadResult> bt = archiveManager.uploadAsync(
    "[yourVaultName]", file);

//設置最大並發數,默認為3,最大為10
bt.setNumConcurrence(5);

bt.addProgressListener(new ProgressListener() {

    @Override
    public void onStart(String id) {
        // 任務開始時調用,其中id為Multipart Upload任務ID,對於一般上傳任務id為空
        System.out.println("Start! Upload ID: " + id);
    }

    @Override
    public boolean onError(Range range, Throwable t) {
        // 出錯時調用,range是出錯的字節範圍,t是相應的錯誤
        // 當返回true時,BaseTransfer會進行重試,false則放棄
        System.out.println("ERROR!!!");
        return false;
    }

    @Override
    public void onCompleted() {
        // 任務完成時調用
        System.out.println("Upload complete");
    }

    @Override
    public void onProgressed(long current, long total) {
        // 上傳進度,total為文件字節大小,current為當前已上傳字節數
        System.out.println("Progress: " + current + " / " + total);
    }
});

bt.start();

final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
        System.out.println("Running time: " + bt.getRunningTime() + " seconds");
        System.out.println("Completed size: " + bt.getSizeCompleted() + " bytes");
        System.out.println("Total size: " + bt.getSizeTotal() + " bytes");
        System.out.println("Average speed: " + bt.getAverageSpeedInBytesPerSecond()
                           + " B/s");
        if (bt.isComplete()) {
            timer.cancel();
            synchronized (bt) {
                bt.notify();
            }
        }
    }

}, 0, 1000);

synchronized (bt) {
    try {
        bt.wait();
    } catch (InterruptedException e) {
        logger.error("", e);
    }
}

// 任務結束
System.out.println("=============================");
System.out.println("Running time: " + bt.getRunningTime() + " seconds");
System.out.println("Completed size: " + bt.getSizeCompleted() + " bytes");
System.out.println("Total size: " + bt.getSizeTotal() + " bytes");
System.out.println("Average speed: " + bt.getAverageSpeedInBytesPerSecond() + " B/s");
UploadResult uploadResult = bt.getResult();
System.out.println("Archive ID: " + uploadResult.getArchiveId());
System.out.println("Hash Value: " + uploadResult.getHashValue());

最後更新:2016-11-23 17:16:04

  上一篇:go Python SDK實例程序__最佳實踐_歸檔存儲-阿裏雲
  下一篇:go adup備份管理__最佳實踐_歸檔存儲-阿裏雲