實例遷移后相關業務的云端API運行需要切換到目標企業版實例下,因此您需開發更新數據庫中設備所屬實例ID信息的方法,以及在調用云端API控制設備服務時,傳入更新后企業版實例ID的方法。本文以Java語言的開發環境為例,介紹實例遷移相關業務系統中服務端的修改示例。
背景信息
實例遷移的詳細說明,請參見使用前必讀。
訂閱實例遷移數據的方法,請參見設置數據流轉規則。
開發環境說明
開發環境如下:
JDK版本:JDK8及以上版本
集成開發環境:IntelliJ IDEA社區版
示例代碼說明
功能 | 說明 |
更新設備數據 | 解析公共實例通過規則引擎訂閱的實例遷移消息:解析遷移成功的設備流轉消息,根據設備信息更新數據庫存儲的實例ID信息。 |
控制設備服務 | 修改控制設備相關業務的接口調用方法: 調用云端接口時,先查詢數據庫表中實例ID信息(企業版實例ID),然后設置接口請求參數IotInstanceId為該企業版實例ID,最后調用接口。 |
更新設備數據的示例代碼
您需依賴AMQP客戶端接入的SDK,開發更新設備數據的方法。AMQP客戶端接入示例,請參見Java SDK接入示例。
更新處理實例遷移消息的方法:processMessage
方法,替換為如下代碼。其中updateDeviceInstanceId(productKey, deviceName, targetInstanceId)
和recoverDeviceInstanceId(productKey, deviceName)
是實現數據庫更新數據的方法,需開發者根據實際場景自行完成開發。
private static void processMessage(Message message) {
try {
byte[] body = message.getBody(byte[].class);
String content = new String(body);
String topic = message.getStringProperty("topic");
String messageId = message.getStringProperty("messageId");
logger.info("receive message"
+ ",\n topic = " + topic
+ ",\n messageId = " + messageId
+ ",\n content = " + content);
if (null == content) {
logger.error("content is null");
}
JSONObject object = JSON.parseObject(content);
String status = object.getString("status");
// 更新遷移成功的設備實例ID。
String targetInstanceId = object.getString("targetInstance");
// 處理遷移成功的設備, 更新為目標企業實例ID。
if (StringUtils.equals(status, "GRAY_EXECUTING") || StringUtils.equals(status, "ALL_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo:根據productKey和deviceName, 按照target更新數據庫中遷移成功的設備實例ID。
// updateDeviceInstanceId(productKey, deviceName, targetInstanceId)
}
}
// 處理回滾成功的設備,恢復為原有實例ID。
if (StringUtils.equals("status", "ROLL_BACK_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo:根據productKey和deviceName, 恢復數據庫中的instanceId. 恢復策略具體需要區分業務場景。
// 1、原有公共實例調用業務沒有存實例ID, 恢復實例ID為null。
// 2、原有公共實例調用存了實例ID特定值, 恢復實例ID為原有默認值。
// recoverDeviceInstanceId(productKey, deviceName)
}
}
} catch (Exception e) {
logger.error("processMessage occurs error ", e);
}
}
控制設備服務的示例代碼
您需依賴物聯網平臺云端SDK,開發調用設備相關業務API的方法。云端SDK使用示例,請參見Java SDK使用說明。
配置依賴的接口調用方法:以Pub接口為例,如下代碼新增調用接口方法pub(client, productKey, deviceName)
。其中getInstanceId(productKey, deviceName)
方法實現邏輯,需開發者根據實際場景自行完成開發。
public static void main(String[] args) {
String accessKey = "${accessKey}";
String accessSecret = "${accessSecret}";
String productKey = "${productKey}";
String deviceName = "${deviceName}";
IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
pub(client, productKey, deviceName);
}
private static void pub(DefaultAcsClient client, String productKey, String deviceName) {
PubRequest request = new PubRequest();
//從數據庫中獲取實例ID。
String instanceId = getInstanceId(productKey, deviceName);
//如果實例ID不為空,傳參設置實例ID。注意只有企業實例需要傳入此參數,公共實例無需傳入此參數。
if (!StringUtils.isEmpty(instanceId)) {
request.setIotInstanceId(instanceId);
}
request.setProductKey("${productKey}");
request.setMessageContent(Base64.encodeBase64String("hello world".getBytes()));
request.setTopicFullName("/${productKey}/${deviceName}/user/get");
request.setQos(0); //目前支持QoS0和QoS1。
try {
PubResponse response = client.getAcsResponse(request);
System.out.println(response.getSuccess());
System.out.println(response.getCode());
System.out.println(response.getErrorMessage());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
e.printStackTrace();
}
}
/**
* 從數據庫中獲取實例ID。
*
* @param productKey
* @param deviceName
* @return
*/
private static String getInstanceId(String productKey, String deviceName) {
String instanceId = "";
// todo:按照 productKey和deviceName從數據庫中查詢梳理信息。
// instanceId = query(productKey, deviceName);
return instanceId;
}