试了下阿里云的OPEN Api
逐渐理解open api的意义,试了下阿里云的续费接口,续费一个月
package com.test; /**
* @author
* @date 2018/12/05
*/
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.aliyuncs.AcsRequest;
import com.aliyuncs.AcsResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.ecs.model.v20140526.RenewInstanceRequest;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile; import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class AliyunRenewInstancesExample { private String accessKeyId = "your-accessKeyId";
private String accessSecret = "your-accessSecret"; /**
* 实例所属的地域ID
*/
private String regionId = "cn-beijing";
/**
* 指定的需要续费的实例 ID
*/
private String[] instanceIds = new String[] {"i-m************"};
/**
* 预付费续费时长
*/
private Integer period = 1;
/**
* 续费时长单位,取值:Week/Month
*/
private String periodUnit = "Month"; private Map<String, InstanceExpiredModel> instanceExpiredModelMap = new HashMap<String, InstanceExpiredModel>();
private static final ExecutorService RENEW_INSTANCE_POOL = Executors.newFixedThreadPool(500);
private static final Integer CHECK_EXPIRED_TIME_OUT_MILLISECOND = 60 * 1000;
private static final Integer CHECK_EXPIRED_TIME_INTERVAL_MILLISECOND = 2 * 1000;
private static final String INSTANCE_CHARGE_TYPE_PREPAID = "PrePaid";
private static final String DESCRIBE_INSTANCES_FILTER_KEY_EXPIRED_START_TIME = "ExpiredStartTime";
private static final String DESCRIBE_INSTANCES_FILTER_KEY_EXPIRED_END_TIME = "ExpiredEndTime"; public static void main(String[] args) {
/**
* 使用须知:
* 调用 OpenAPI 续费会自动扣费,请谨慎调用
* 您的账号必须支持账号余额支付或信用支付,请确保金额充足
*
* 调用续费API后会对 新的到期时间 和 原始的到期时间 进行比较并分别输出成功和失败的实例
*/
new AliyunRenewInstancesExample().callRenewInstance();
} private void callRenewInstance() {
/**
* 若需查询需要续费的实例,可查看 describeNeedRenewInstances 方法
*/
//List<String> needRenewInstanceIds = describeNeedRenewInstances();
List<String> instanceIdList = Arrays.asList(instanceIds);
List<DescribeInstancesResponse.Instance> instances = describeInstances(instanceIdList);
if (!checkInstanceIds(instances, instanceIdList)) {
return;
}
updateInstanceOriginalExpiredTime(instances);
for (final String instanceId : instanceIdList) {
RENEW_INSTANCE_POOL.execute(new Runnable() {
public void run() {
RenewInstanceRequest request = new RenewInstanceRequest();
request.setRegionId(regionId);
request.setInstanceId(instanceId);
request.setPeriod(period);
request.setPeriodUnit(periodUnit);
callOpenApi(request, instanceExpiredModelMap.get(instanceId));
}
});
}
try {
RENEW_INSTANCE_POOL.shutdown();
RENEW_INSTANCE_POOL.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
checkInstancesExpiredTime(instanceIdList);
}
/**
* 每2秒中检查一次实例的到期时间,超时时间设为1分钟
*
* @param instanceIds 需要检查的实例ID
*/
private void checkInstancesExpiredTime(List<String> instanceIds) {
Long startTime = System.currentTimeMillis();
for (;;) {
boolean allCompleted = true;
Long timeStamp = System.currentTimeMillis();
updateInstanceNewExpiredTime(instanceIds);
for (String instanceId : instanceExpiredModelMap.keySet()) {
InstanceExpiredModel instanceExpiredModel = instanceExpiredModelMap.get(instanceId);
if (instanceExpiredModel.newExpiredTime == null && instanceExpiredModel.errorCode == null) {
allCompleted = false;
}
}
if (allCompleted) {
logRenewResult();
return;
}
if (timeStamp - startTime > CHECK_EXPIRED_TIME_OUT_MILLISECOND) {
logInfo(String.format("Check instance new expiredTime timeout. Because it takes too much time, View the result detail: %s",
JSON.toJSONString(instanceExpiredModelMap, SerializerFeature.PrettyFormat)));
return;
}
sleepSomeTime(CHECK_EXPIRED_TIME_INTERVAL_MILLISECOND);
}
} private boolean checkInstanceIds(List<DescribeInstancesResponse.Instance> instances,
List<String> instanceIds) {
if (instances.size() != instanceIds.size()) {
List<String> responseInstanceIds = new ArrayList<String>();
List<String> invalidInstanceIds = new ArrayList<String>();
for (DescribeInstancesResponse.Instance instance : instances) {
responseInstanceIds.add(instance.getInstanceId());
}
for (String instanceId : instanceIds) {
if (!responseInstanceIds.contains(instanceId)) {
invalidInstanceIds.add(instanceId);
}
}
logInfo(String.format("Fail. CheckInstanceIds failure. Invalid InstanceIds: %s",
JSON.toJSONString(invalidInstanceIds)));
return false;
}
return true;
} /**
* 记录 instance 原始到期时间,以便在调用续费 OpenAPI 后 check 到期时间是否发生变化来判断续费是否成功
*
* @param instances
* @return
*/
private boolean updateInstanceOriginalExpiredTime(List<DescribeInstancesResponse.Instance> instances) {
for (DescribeInstancesResponse.Instance instance : instances) {
InstanceExpiredModel instanceExpiredModel = new InstanceExpiredModel();
instanceExpiredModel.instanceId = instance.getInstanceId();
instanceExpiredModel.originalExpiredTime = instance.getExpiredTime();
instanceExpiredModelMap.put(instance.getInstanceId(), instanceExpiredModel);
}
return true;
} private void updateInstanceNewExpiredTime(List<String> instanceIds) {
List<DescribeInstancesResponse.Instance> instances = describeInstances(instanceIds);
for (DescribeInstancesResponse.Instance instance : instances) {
InstanceExpiredModel instanceExpiredModel = instanceExpiredModelMap.get(instance
.getInstanceId());
if (!instance.getExpiredTime().equals(instanceExpiredModel.originalExpiredTime)) {
instanceExpiredModel.newExpiredTime = instance.getExpiredTime();
}
}
} private List<DescribeInstancesResponse.Instance> describeInstances(List<String> instanceIds) {
int offset = 0;
int pageSize = 100;
int totalCount = instanceIds.size();
List<DescribeInstancesResponse.Instance> instances = new ArrayList<DescribeInstancesResponse.Instance>();
while (offset < totalCount) {
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
describeInstancesRequest.setRegionId(regionId);
describeInstancesRequest.setPageSize(pageSize);
describeInstancesRequest.setInstanceChargeType(INSTANCE_CHARGE_TYPE_PREPAID);
describeInstancesRequest.setInstanceIds(JSON.toJSONString(instanceIds.subList(offset,
Math.min(totalCount, offset + pageSize))));
DescribeInstancesResponse response = callOpenApi(describeInstancesRequest, null);
if (response == null || response.getInstances().size() == 0) {
logInfo(String.format("Fail. Can not find instance. InstanceIds: %s", JSON.toJSONString(instanceIds)));
return instances;
}
instances.addAll(response.getInstances());
offset += response.getPageSize();
}
return instances;
} private Map<String, InstanceExpiredModel> getFailedInstances() {
Map<String, InstanceExpiredModel> failedInstances = new HashMap<String, InstanceExpiredModel>();
for (String instanceId : instanceExpiredModelMap.keySet()) {
InstanceExpiredModel instanceExpiredModel = instanceExpiredModelMap.get(instanceId);
if (instanceExpiredModel.errorCode != null) {
failedInstances.put(instanceId, instanceExpiredModel);
}
}
return failedInstances;
} private Map<String, InstanceExpiredModel> getSuccessInstances() {
Map<String, InstanceExpiredModel> successInstances = new HashMap<String, InstanceExpiredModel>();
for (String instanceId : instanceExpiredModelMap.keySet()) {
InstanceExpiredModel instanceExpiredModel = instanceExpiredModelMap.get(instanceId);
if (instanceExpiredModel.errorCode == null
&& instanceExpiredModel.newExpiredTime != null
&& !instanceExpiredModel.originalExpiredTime
.equals(instanceExpiredModel.newExpiredTime)) {
successInstances.put(instanceId, instanceExpiredModel);
}
}
return successInstances;
} /**
* 调用OpenAPI的方法,这里进行了错误处理
*
* @param request AcsRequest, Open API的请求
* @param <T> AcsResponse 请求所对应返回值
* @return 返回OpenAPI的调用结果. 如果调用失败,则会返回null
*/
private <T extends AcsResponse> T callOpenApi(AcsRequest<T> request, BaseResult errorResult) {
IAcsClient client = initClient();
try {
T response = client.getAcsResponse(request, false, 0);
logInfo(String.format("Success. OpenAPI Action: %s call successfully.",
request.getActionName()));
return response;
} catch (ClientException e) {
buildErrResult(errorResult, e);
}
return null;
} /**
* 需要填充账号的AccessKey ID,以及账号的Access Key Secret
*/
private IAcsClient initClient() {
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessSecret);
return new DefaultAcsClient(profile);
} private void logRenewResult() {
logInfo("-------- Renew Instances Result --------");
Map<String, InstanceExpiredModel> failedInstances = getFailedInstances();
if (failedInstances.size() > 0) {
logInfo(String.format("Fail. Some instances renew failure, result: %s",
JSON.toJSONString(failedInstances, SerializerFeature.PrettyFormat)));
Map<String, InstanceExpiredModel> successInstances = getSuccessInstances();
if (successInstances.size() > 0) {
logInfo(String.format("Success. Some instances renew success, result: %s",
JSON.toJSONString(successInstances, SerializerFeature.PrettyFormat)));
}
} else {
logInfo(String.format("Success. RenewInstance result: %s", JSON.toJSONString(
instanceExpiredModelMap, SerializerFeature.PrettyFormat)));
}
} private static void sleepSomeTime(int sleepTime) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
} private static void buildErrResult(BaseResult errResult, ClientException e) {
if (errResult != null) {
errResult.errorCode = e.getErrCode();
errResult.requestId = e.getRequestId();
}
if (e instanceof ServerException) {
logInfo(String.format("Fail. Something with your connection with Aliyun go incorrect. ErrorCode: %s",
e.getErrCode()));
} else {
logInfo(String.format("Fail. Business error. ErrorCode: %s, RequestId: %s",
e.getErrCode(), e.getRequestId()));
}
} private static void logInfo(String message) {
System.out.println(message);
} private List<String> describeNeedRenewInstances() {
String instanceExpiredStartTimeUtc = "2018-10-21T16:00Z";
String instanceExpiredEndTimeUtc = "2018-12-01T16:00Z";
List<String> instanceIds = new ArrayList<String>(); int pageSize = 100;
int pageNumber = 1;
int totalCount = 1;
while (instanceIds.size() < totalCount) {
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
describeInstancesRequest.setRegionId(regionId);
describeInstancesRequest.setFilter3Key(DESCRIBE_INSTANCES_FILTER_KEY_EXPIRED_START_TIME);
describeInstancesRequest.setFilter3Value(instanceExpiredStartTimeUtc);
describeInstancesRequest.setFilter4Key(DESCRIBE_INSTANCES_FILTER_KEY_EXPIRED_END_TIME);
describeInstancesRequest.setFilter4Value(instanceExpiredEndTimeUtc);
describeInstancesRequest.setInstanceChargeType(INSTANCE_CHARGE_TYPE_PREPAID);
describeInstancesRequest.setPageSize(pageSize);
describeInstancesRequest.setPageNumber(pageNumber);
DescribeInstancesResponse response = callOpenApi(describeInstancesRequest, null);
if (response == null || response.getTotalCount() == 0) {
logInfo("Fail. DescribeNeedRenewInstances occurred error or response.getTotalCount() == 0");
return instanceIds;
}
for (DescribeInstancesResponse.Instance instance : response.getInstances()) {
instanceIds.add(instance.getInstanceId());
}
totalCount = response.getTotalCount();
pageNumber++;
}
logInfo(String.format("Success. DescribeNeedRenewInstances result: %s", instanceIds.toString()));
return instanceIds;
} class BaseResult {
public String errorCode;
public String requestId;
} class InstanceExpiredModel extends BaseResult {
public String instanceId;
public String originalExpiredTime;
public String newExpiredTime;
}
}
执行结果,用账户余额支付了一月个的续费
Success. OpenAPI Action: DescribeInstances call successfully.
Success. OpenAPI Action: RenewInstance call successfully.
Success. OpenAPI Action: DescribeInstances call successfully.
-------- Renew Instances Result --------
Success. RenewInstance result: {
"i-m**********":{
"instanceId":"i-m************",
"newExpiredTime":"2019-01-05T16:00Z",
"originalExpiredTime":"2018-12-05T16:00Z"
}
}
试了下阿里云的OPEN Api的更多相关文章
- 五:用JAVA写一个阿里云VPC Open API调用程序
用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...
- 阿里云视频直播API签名机制源码
阿里云视频直播API签名机制源码 本文展示:通过代码实现下阿里视频直播签名处理规则 阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail ...
- 阿里云学习之API网关
注:此处仅供api的创建做一个补充参考,API网关的优缺点及创建过程中的参数详情,请参考阿里云开放文档:https://helpcdn.aliyun.com/document_detail/29478 ...
- PHP控制阿里云短信API接口实现短信群发功能
阿里云短信支持先使用后支付的原则,价格为4分半1条. 通过SDK可以与网站功能的绑定,实现响应的短信发送功能 现已统一合并升级为:消息服务. 消息服务 阿里云消息服务(Message Service, ...
- 阿里云oss c# api 的使用 的使用
API 文档下载地址:http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32085/cn_zh/1515493045734 ...
- 基于阿里云 DNS API 实现的 DDNS 工具
0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...
- 【阿里云API】 阿里云API调用的若干说明
阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...
- C#调用阿里云CDN API刷新缓存
使用CDN必须要解决CDN缓存的问题,要么在每次更新文件时生成不同的URL,要么在每次更新文件时刷新CDN缓存.我们在一个实际应用场景中用到了后者,所以需要调用阿里云CDN的API进行缓存刷新的操作. ...
- 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...
随机推荐
- Python 进程池的异步方法
import time from multiprocessing import Process,Pool def f1(n): time.sleep(0.5) # print(n) return n* ...
- Java多线程入门中几个常用的方法
一.currentThread()方法 currentThread方法就是返回当前被调用的线程. 该方法为一个本地方法,原码如下: /** * Returns a reference to the c ...
- jquery移除元素时会自动解绑事件
.html() When .html() is used to set an element's content, any content that was in that element is co ...
- es6 Array数组方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- oracle query
不等值连接查询 员工工资级别 select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losa ...
- git 从分支上创建一个分支
相关连接: 创建于合并分支:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00 ...
- js中常用的内置对象
Arguments 函数参数集合 arguments[ ] 函数参数的数组 Arguments 一个函数的参数和其他属性 Arguments.callee 当前正在运行的函数 Argument ...
- redis使用get key中文变成十六进制编码
redis-cli 后面加上 --raw 解决中文显示问题 redis-cli -h 127.0.0.1 -p 端口 -a 密码 --raw 不带 --raw 参数: redis-cli -h &g ...
- C++类中一个构造函数调用另一个构造函数
class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...
- linux删除某用户密码
1.清空一个linux用户密码 # passwd -d user1 passwd: password expiry information changed. 2.指定key登录 ssh port111 ...