Todos os produtos
Search
Central de documentação

IoT Platform:Exemplo de modificações no servidor para migração de instância

Última atualização: Jun 26, 2026

Após a migração de uma instância, redirecione as chamadas de API da nuvem dos serviços relacionados para a instância Enterprise Edition de destino. Para isso, desenvolva métodos que atualizem o ID da instância do dispositivo no banco de dados e transmitam o novo ID da instância Enterprise Edition ao invocar as APIs da nuvem para controlar os serviços do dispositivo. Este exemplo utiliza um ambiente de desenvolvimento Java.

Informações prévias

Para obter mais detalhes sobre a migração de instâncias, consulte Leitura obrigatória antes de começar.

Para assinar os dados de migração de instâncias, consulte Configure regras de encaminhamento de dados.

Ambiente de desenvolvimento

O ambiente de desenvolvimento requer:

Descrição do código de exemplo

Recurso

Descrição

Atualize dados do dispositivo

Analisa mensagens de migração de instância assinadas de uma instância pública por meio do mecanismo de regras. Processa mensagens de encaminhamento de dados de dispositivos migrados com êxito e atualiza o ID da instância no banco de dados com base nas informações do dispositivo.

Controlar serviços do dispositivo

Modifica o método de chamada de API para serviços de controle de dispositivos. Ao chamar uma API da nuvem, consulte o ID da instância Enterprise Edition na tabela do banco de dados, defina o parâmetro de solicitação IotInstanceId com esse ID e invoque a API.

Código de exemplo para atualização de dados do dispositivo

O método para atualizar dados do dispositivo depende do SDK de acesso ao cliente AMQP. Para ver um exemplo de acesso via cliente AMQP, consulte Exemplo de acesso com SDK Java.

Para modificar o método de processamento de mensagens de migração de instância, substitua o método processMessage pelo código a seguir. Os métodos updateDeviceInstanceId(productKey, deviceName, targetInstanceId) e recoverDeviceInstanceId(productKey, deviceName) atualizam dados no banco de dados. Desenvolva esses métodos conforme necessário.

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");

            // Update the instance ID of the successfully migrated device.
            String targetInstanceId = object.getString("targetInstance");

            // Process the successfully migrated devices and update their instance IDs to the target Enterprise instance 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: Update the instance ID of the successfully migrated device in the database based on the productKey, deviceName, and target.
                    // updateDeviceInstanceId(productKey, deviceName, targetInstanceId)

                }
            }

            // Process the successfully rolled-back devices and restore their original instance IDs.
            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: Restore the instanceId in the database based on the productKey and deviceName. The recovery policy depends on the business scenario.
                    // 1. If the original business that called the public instance did not store an instance ID, restore the instance ID to null.
                    // 2. If the original business that called the public instance stored a specific instance ID value, restore the instance ID to its original default value.
                    // recoverDeviceInstanceId(productKey, deviceName)
                }
            }
        } catch (Exception e) {
            logger.error("processMessage occurs error ", e);
        }
    }

Código de exemplo para controle de serviços do dispositivo

A chamada de APIs de negócios relacionadas a dispositivos depende do SDK da nuvem do IoT Platform. Para mais informações, consulte Notas de uso do SDK Java.

O código a seguir usa a API Pub como exemplo e adiciona o método de chamada pub(client, productKey, deviceName). Implemente o método getInstanceId(productKey, deviceName) conforme seus requisitos.

  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();
        // Obtain the instance ID from the database.
        String instanceId = getInstanceId(productKey, deviceName);

        // If the instance ID is not empty, pass the parameter to set the instance ID. Note that only Enterprise instances require this parameter. Public instances do not.
        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); // QoS 0 and QoS 1 are supported.
        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();
        }
    }

    /**
     * Obtain the instance ID from the database.
     *
     * @param productKey
     * @param deviceName
     * @return
     */
    private static String getInstanceId(String productKey, String deviceName) {
        String instanceId = "";
        // todo: Query and organize information from the database based on the productKey and deviceName.
        // instanceId = query(productKey, deviceName);

        return instanceId;
    }