日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

實例遷移服務端修改示例

實例遷移后相關業務的云端API運行需要切換到目標企業版實例下,因此您需開發更新數據庫中設備所屬實例ID信息的方法,以及在調用云端API控制設備服務時,傳入更新后企業版實例ID的方法。本文以Java語言的開發環境為例,介紹實例遷移相關業務系統中服務端的修改示例。

背景信息

實例遷移的詳細說明,請參見使用前必讀

訂閱實例遷移數據的方法,請參見設置數據流轉規則

開發環境說明

開發環境如下:

示例代碼說明

功能

說明

更新設備數據

解析公共實例通過規則引擎訂閱的實例遷移消息:解析遷移成功的設備流轉消息,根據設備信息更新數據庫存儲的實例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;
    }