前言
由于抢占式实例天然具有被中断的风险,在实例中断前至少5分钟,系统会向您发送中断消息。此时您可以依据 抢占式实例接收中断消息指南 来进行中断消息的处理. 但在开发"中断处理程序"阶段, 由于您实例的中断是由阿里云触发, 概率极低且是非常随机的过程, 调试与验证中断处理程序可能会比较困难.
基于此, 我们目前提供了以下两种模拟中断事件的方式, 以便您进行程序调试:
方式1:使用云监控控制台模拟中断事件
具体请参见:抢占式实例接收中断消息指南一文。
方式2:调用OpenAPI进行调试
以云监控订阅中断事件, 并将事件投递到MQ消息队列为例
前提条件
在使用本教程之前,请确保已完成以下操作:
- 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面查看您的访问密钥。
- 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)。
<dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.0.13</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>cms20190101</artifactId> <version>1.0.1</version> </dependency>
第一步:创建云监控的事件报警规则
示范代码如下:
// This file is auto-generated, don't edit it. Thanks. package com.aliyun.sample; import com.aliyun.tea.*; import com.aliyun.cms20190101.*; import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.*; import com.aliyun.teaopenapi.models.*; /** * 调用 PutEventRule * 创建或修改事件的报警规则 */ public class Sample { /** * 使用AK&SK初始化账号Client * @param accessKeyId * @param accessKeySecret * @return Client * @throws Exception */ public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { Config config = new Config() // 您的AccessKey ID .setAccessKeyId(accessKeyId) // 您的AccessKey Secret .setAccessKeySecret(accessKeySecret); // 访问的域名 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret"); PutEventRuleRequest.PutEventRuleRequestEventPattern eventPattern0 = new PutEventRuleRequest.PutEventRuleRequestEventPattern() .setEventTypeList(java.util.Arrays.asList( "*" )) // 事件报警规则的类型 .setLevelList(java.util.Arrays.asList( "*" )) // 事件报警规则的等级 .setNameList(java.util.Arrays.asList( "Instance:PreemptibleInstanceInterruption" )) // 事件报警规则的名称 .setProduct("ECS"); // 云服务类型 PutEventRuleRequest putEventRuleRequest = new PutEventRuleRequest() .setRuleName("spot_release_event_test") // 事件报警规则名称 .setEventPattern(java.util.Arrays.asList( eventPattern0 )) .setEventType("SYSTEM") // 事件报警规则的类型 .setState("ENABLED"); // 事件报警规则的状态 // 复制代码运行请自行打印 API 的返回值 client.putEventRule(putEventRuleRequest); } }
第二步:创建消息队列
具体请参见:消息服务MNS一文
第三步:添加规则的发送目标
示范代码如下:
// This file is auto-generated, don't edit it. Thanks. package com.aliyun.sample; import com.aliyun.tea.*; import com.aliyun.cms20190101.*; import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.*; import com.aliyun.teaopenapi.models.*; /** * 调用 PutEventRuleTargets * 添加或修改规则的发送目标 */ public class Sample { /** * 使用AK&SK初始化账号Client * @param accessKeyId * @param accessKeySecret * @return Client * @throws Exception */ public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { Config config = new Config() // 您的AccessKey ID .setAccessKeyId(accessKeyId) // 您的AccessKey Secret .setAccessKeySecret(accessKeySecret); // 访问的域名 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret"); PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters mnsParameters0 = new PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters() .setRegion("cn-hangzhou") // 消息服务对应的地域 .setId("1") // 规则发送目标的唯一标识 .setQueue("mq-test"); // 队列名称 PutEventRuleTargetsRequest putEventRuleTargetsRequest = new PutEventRuleTargetsRequest() .setRuleName("spot_release_event_test") // 报警规则的名称 .setMnsParameters(java.util.Arrays.asList( mnsParameters0 )); // 复制代码运行请自行打印 API 的返回值 client.putEventRuleTargets(putEventRuleTargetsRequest); } }
第四步:发送模拟系统事件
示范代码如下:
package com.aliyun.sample; import com.aliyun.tea.*; import com.aliyun.cms20190101.*; import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.*; import com.aliyun.teaopenapi.models.*; /** *调用 SendDryRunSystemEvent *调试云资源的系统事件 * */ public class Sample { /** * 使用AK&SK初始化账号Client * @param accessKeyId * @param accessKeySecret * @return Client * @throws Exception */ public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { Config config = new Config() // 您的AccessKey ID .setAccessKeyId(accessKeyId) // 您的AccessKey Secret .setAccessKeySecret(accessKeySecret); // 访问的域名 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret"); SendDryRunSystemEventRequest sendDryRunSystemEventRequest = new SendDryRunSystemEventRequest() .setProduct("ecs") // 云服务名称 .setEventName("Instance:PreemptibleInstanceInterruption") // 事件名称 .setEventContent("{\"product\":\"ECS\",\"resourceId\":\"acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef\",\"level\":\"WARN\",\"instanceName\":\"instanceName\",\"regionId\":\"cn-beijing\",\"name\":\"Instance:PreemptibleInstanceInterruption\",\"content\": {\"instanceId\":\"i-abcdefghijklmn\",\"action\":\"delete\"},\"status\":\"Normal\"}"); // 事件内容 // 复制代码运行请自行打印 API 的返回值 client.sendDryRunSystemEvent(sendDryRunSystemEventRequest); } }
第五步:通过消息验证是否收到消息
具体请参见:消息服务MNS一文