开发者社区> 问答> 正文

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("http://cn-hangzhou.oas.aliyuncs.com");

// 用OAS工厂获得AliyunOASClient对象
AliyunOASClient aliyunOASClient = OASFactory.aliyunOASClientFactory(
    serviceHost, credentials, clientConf);




// 或者像下面这样,通过ServiceCredentials和url直接创建AliyunOASClient对象
AliyunOASClient aliyunOASClient = OASFactory.aliyunOASClientFactory(
    credentials, "http://cn-hangzhou.oas.aliyuncs.com");

// 自定义配置ClientConfiguration
ServiceCredentials credentials = new ServiceCredentials("[yourAccessKeyID]", "[yourAccessKeySecret]");
// 指定要连接的服务地址
ServiceHost serviceHost = new ServiceHost("http://cn-hangzhou.oas.aliyuncs.com");
// 配置客户端设置
ClientConfiguration clientConf = new ClientConfiguration();

ArchiveManager archiveManager = new ArchiveManager(serviceHost, credentials, clientConf);






ArchiveManager实例化// 使用默认配置
ServiceCredentials credentials = new ServiceCredentials("[yourAccessKeyID]", "[yourAccessKeySecret]");
ArchiveManager manager = OASFactory.archiveManagerFactory(
credentials, "http://cn-hangzhou.oas.aliyuncs.com");




// 使用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 uploadId=" + uploadId);
UploadResult uploadResult = archiveManager.uploadWithUploadId(vaultName, file, uploadId);
System.out.println("Archive ID=" + uploadResult.getArchiveId());





任务执行


下载任务是通过提交任务、下载任务输出的异步过程执行的,任务的详细介绍,参考 OAS Java SDK高级接口文档

提交提档任务String yourVaultName = "oas_demo";
String yourArchiveId = "6086C62DBFFD4A68BAEE9D1B680EC77C8FE6AE617FF47BCD3DB3CB71AFAE29B33431AED14D06D9C4AD251F17C173F3CD";
JobMonitor jobMonitor = archiveManager.downloadAsync(yourVaultName, yourArchiveId);





执行InventoryJobMonitor 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());

展开
收起
云栖大讲堂 2017-10-26 15:40:00 2130 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载