Todos os produtos
Search
Central de documentação

Platform For AI:Java SDK

Última atualização: Jun 27, 2026

Este guia explica como usar o Java SDK para chamar serviços de modelo do Elastic Algorithm Service (EAS) e fornece exemplos de entrada/saída e um programa de amostra.

Nota

Para casos de uso e princípios do SDK, consulte SDK de invocação de serviço.

Pré-requisitos

Para usar o Java SDK do EAS em seu projeto Maven, adicione a dependência eas-sdk à seção <dependencies> do arquivo pom.xml. Para obter a versão mais recente, verifique o repositório Maven.

<dependency>
  <groupId>com.aliyun.openservices.eas</groupId>
  <artifactId>eas-sdk</artifactId>
  <version>2.0.20</version>
</dependency>

O EAS SDK 2.0.5 e versões posteriores incluem a funcionalidade de cliente QueueService para o serviço de fila assíncrona com múltiplas prioridades. Para utilizar esse recurso e evitar conflitos de dependência, adicione as duas dependências a seguir e ajuste as versões conforme necessário:

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.1</version>
</dependency>

Início rápido

Para chamar um serviço com o Java SDK, siga estas três etapas:

  1. Obtenha as informações de chamada: Na página de detalhes do serviço no console EAS, acesse a aba Call Information para obter o endpoint, o nome do serviço e o token.

  2. Escolha um tipo de solicitação e escreva o código: Selecione a classe Request/Response apropriada com base no formato dos dados de entrada do modelo e escreva o código usando o exemplo mínimo abaixo.

    Nota

    Se você implantou o serviço com um Processor integrado, o SDK fornece classes de entrada e saída correspondentes. Por exemplo, o TensorFlow Processor integrado corresponde a TFRequest. Para mais informações, consulte a documentação de cada processor em Processors Integrados.

  3. Execute e verifique: Execute o programa cliente e verifique a resposta. Se ocorrer um erro, consulte o guia de Solução de problemas.

O código a seguir é um exemplo mínimo de ponta a ponta de uma solicitação de string. Para mais exemplos, consulte Exemplos de programas:

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;

public class TestString {
    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());
        
        // To use a VPC direct connection, call the setDirectEndpoint method. The format is typically {uid}.vpc.{region-id}.pai-eas.aliyuncs.com.
        client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // The public endpoint for the EAS service. The format is typically {uid}.{region-id}.pai-eas.aliyuncs.com.
        // client.setEndpoint("182848887922****.cn-shanghai.pai-eas.aliyuncs.com");
        
        // The name of the EAS service.
        client.setModelName("your_service_name");
        client.setToken("YOUR_SERVICE_TOKEN");
        // The request path. The complete request URL is http://<endpoint>/api/direct/<modelName>/<requestPath>.
        client.setRequestPath("your_custom_path");
        // Construct the request body. The supported input classes depend on the SDK. This example uses a String.
        String request = "[{}]";
        String response = client.predict(request);
        System.out.println(response);

        client.shutdown();
    }
}

Referência da API

O Java SDK fornece as seguintes classes:

Grupo

Descrição da classe

Classe Principal do Cliente

PredictClient: Classe principal para configurar detalhes do serviço, como endpoint e token, enviar solicitações e receber respostas.

Configuração de conexão

HttpConfig: Configura parâmetros de conexão HTTP, como timeouts e número máximo de conexões.

Entrada/saída

  • TFRequest: Encapsula uma solicitação para um modelo TensorFlow.

  • TFResponse: Analisa a resposta de um modelo TensorFlow.

  • Em cenários baseados em string, classes dedicadas de solicitação ou resposta são desnecessárias. É possível passar e receber dados diretamente como objetos String.

  • Para detalhes sobre outros tipos suportados, consulte o SDK.

Serviço de fila

  • QueueClient: Cliente de fila assíncrona para enviar e assinar dados. Esta classe requer dependências adicionais, conforme descrito em Pré-requisitos.

  • DataFrame: Objeto que encapsula um item de dados do serviço de fila.

Classe PredictClient

Classe principal do cliente. Configure as informações do serviço, envia solicitações e recebe resultados de previsão.

API

Descrição

PredictClient(HttpConfig httpConfig)

  • Constrói uma instância de PredictClient.

  • Parâmetro: httpConfig é uma instância da classe HttpConfig.

void setToken(String token)

  • Defina o token de autenticação para solicitações HTTP.

  • Parâmetro: token é o token de autenticação para acesso ao serviço.

void setModelName(String modelName)

  • Defina o nome do modelo para o serviço de previsão online.

  • Parâmetro: modelName é o nome do modelo a ser usado.

void setEndpoint(String endpoint)

  • Especifique o host e a porta do serviço solicitado. O formato é "host:port".

  • Parâmetro: endpoint é o endereço do endpoint do serviço no formato "host:port".

void setDirectEndpoint(String endpoint)

  • Defina o endpoint para acessar o serviço via conexão direta VPC.

  • Parâmetro: endpoint é o endereço do endpoint do serviço.

void setRequestPath(String requestPath)

  • Defina o caminho da solicitação conforme especificado no código do servidor.

  • Parâmetro: requestPath é o caminho da solicitação no servidor. Exemplo: client.setRequestPath("/custom_path").

void setRetryCount(int retryCount)

  • Defina o número de tentativas para solicitações com falha.

  • Parâmetro: retryCount é o número de tentativas.

void setRetryConditions(EnumSet retryConditions)

  • Defina as condições para tentar novamente uma solicitação. Use este método em conjunto com setRetryCount. Por padrão, todos os erros de solicitação geram novas tentativas. Este método permite especificar que apenas erros específicos devem acionar uma nova tentativa.

  • Parâmetro: retryConditions é um EnumSet contendo uma ou mais condições de nova tentativa. As condições suportadas incluem:

    • RetryCondition.CONNECTION_FAILED: A conexão da solicitação falhou.

    • RetryCondition.CONNECTION_TIMEOUT: A conexão da solicitação expirou.

    • RetryCondition.READ_TIMEOUT: A solicitação expirou enquanto aguardava uma resposta.

    • RetryCondition.RESPONSE_5XX: O servidor retornou um código de status 5xx.

    • RetryCondition.RESPONSE_4XX: O servidor retornou um código de status 4xx.

  • Exemplo:

    client.setRetryConditions(
            EnumSet.of(
                RetryCondition.READ_TIMEOUT,    // Retry on read timeout
                RetryCondition.RESPONSE_5XX     // Retry on 5xx error codes
            )
        );

    Este exemplo especifica que uma solicitação será repetida apenas se expirar ou se o servidor retornar um código de status 5xx.

void setContentType(String contentType)

  • Defina o Content-Type para a solicitação HTTP. O padrão é "application/octet-stream".

  • Parâmetro: contentType é o tipo de conteúdo do fluxo de dados enviado.

void setUrl(String url)

Defina uma URL de solicitação personalizada.

void setCompressor(Compressor compressor)

  • Defina o método de compactação para os dados da solicitação.

  • Parâmetro: compressor é o método de compactação. Os valores suportados são Compressor.Gzip e Compressor.Zlib.

  • Para mais informações, consulte Exemplo de Compactação de Dados de Solicitação.

void addExtraHeaders(Map<String, String> extraHeaders)

  • Adiciona cabeçalhos HTTP personalizados à solicitação.

  • Parâmetro: extraHeaders é um Map<String, String> de cabeçalhos HTTP a serem adicionados.

void createChildClient(String token, String endpoint, String modelName)

  • Crie um cliente filho que compartilha o pool de threads do cliente pai. Útil para previsões multithread.

  • Parâmetros:

    • token: O token de autenticação para o serviço.

    • endpoint: O endpoint do serviço.

    • modelName: O nome do modelo.

void predict(TFRequest runRequest)

  • Envia uma solicitação TensorFlow para o serviço de previsão online.

  • Parâmetro: runRequest é uma instância de um objeto TFRequest.

void predict(String requestContent)

  • Envia uma solicitação baseada em string para o serviço de previsão online.

  • Parâmetro: requestContent é o conteúdo da solicitação como uma string.

void predict(byte[] requestContent)

  • Envia uma solicitação de array de bytes para o serviço de previsão online.

  • Parâmetro: requestContent é o conteúdo da solicitação como um array de bytes.

Classe HttpConfig

Configure parâmetros subjacentes de conexão HTTP, como timeouts, contagem de threads e pool de conexões.

API

Descrição

void setIoThreadNum(int ioThreadNum)

  • Defina o número de threads de I/O para solicitações HTTP. O padrão é 2.

  • Parâmetro: ioThreadNum é o número de threads de I/O.

void setReadTimeout(int readTimeout)

  • Tempo máximo de espera por um pacote de dados do servidor após o estabelecimento da conexão. O valor padrão é 5000 (5 segundos).

  • Parâmetro: readTimeout é o timeout de leitura em milissegundos.

Importante

Este timeout se aplica somente após o estabelecimento da conexão. Difere do timeout de solicitação definido pelo método setRequestTimeout.

void setRequestTimeout(int requestTimeout)

  • Tempo total permitido para uma solicitação, desde o envio até o recebimento da resposta completa. O valor padrão é 5000 (5 segundos).

  • Parâmetro: requestTimeout é o timeout da solicitação em milissegundos.

Importante

Este timeout abrange todo o ciclo de vida da solicitação, incluindo estabelecimento de conexão, transferência de dados e processamento pelo servidor. Difere do timeout de leitura definido pelo método setReadTimeout.

void setConnectTimeout(int connectTimeout)

  • Tempo máximo de espera ao estabelecer uma conexão. O valor padrão é 5000 (5 segundos).

  • Parâmetro: connectTimeout é o timeout de conexão em milissegundos.

void setMaxConnectionCount(int maxConnectionCount)

  • Defina o número total máximo de conexões no pool de conexões. O padrão é 1000.

  • Parâmetro: maxConnectionCount é o número máximo de conexões.

void setMaxConnectionPerRoute(int maxConnectionPerRoute)

  • Defina o número máximo de conexões por rota. O padrão é 1000.

  • Parâmetro: maxConnectionPerRoute é o número máximo de conexões para cada rota.

void setKeepAlive(boolean keepAlive)

  • Ative o keep-alive para o serviço HTTP.

  • Parâmetro: keepAlive. Especifica se deve ativar o mecanismo de keep-alive para a conexão. O valor padrão é true.

int getErrorCode()

Retorna o código de status da última chamada de API.

String getErrorMessage()

Retorna a mensagem de status da última chamada de API.

Classe TFRequest

Constrói os dados de entrada para um modelo TensorFlow.

API

Descrição

void setSignatureName(String value)

  • Especifique o nome do signatureDef para o modelo solicitado quando o modelo está no formato TensorFlow SavedModel.

  • Parâmetro: O nome do signatureDef para o modelo da solicitação.

void addFetch(String value)

  • Especifique um tensor de saída a ser obtido do modelo.

  • Parâmetro: value é o alias do tensor de saída a ser obtido.

void addFeed(String inputName, TFDataType dataType, long[]shape, ?[]content)

  • Adiciona um tensor de entrada à solicitação.

  • Parâmetros:

    • inputName: O alias do tensor de entrada.

    • dataType: O tipo de dados do tensor de entrada.

    • shape: A forma do tensor de entrada.

    • content: O conteúdo do tensor, fornecido como um array unidimensional achatado. O tipo de elemento no array depende do dataType:

      Se o DataType do Tensor de entrada for DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 ou DT_HALF, o tipo de elemento em content é FLOAT. Quando o DataType é DT_COMPLEX64, dois elementos FLOAT adjacentes em content representam as partes real e imaginária de um número complexo, respectivamente.

      Se o DataType do Tensor de entrada for DT_DOUBLE ou DT_COMPLEX128, os elementos em content são do tipo DOUBLE. Quando o DataType é DT_COMPLEX128, dois elementos DOUBLE adjacentes em content representam as partes real e imaginária de um número complexo, respectivamente.

      Se o DataType do Tensor de entrada for DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 ou DT_UINT16, o tipo de elemento em content é INT.

      Se o DataType do Tensor de entrada for DT_INT64, o tipo de elemento em content é LONG.

      Se o DataType do Tensor de entrada for DT_STRING, o tipo de elemento em content é STRING.

      Se o DataType do Tensor de entrada for DT_BOOL, o tipo de elemento em content é BOOLEAN.

Classe TFResponse

Analisa e acessa os dados de saída de uma previsão de modelo TensorFlow.

API

Descrição

List<Long> getTensorShape(String outputName)

  • Obtém a forma de um tensor de saída especificado.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Retorno: Uma lista de longs representando a forma do tensor.

List<Float> getFloatVals(String outputName)

  • Se o DataType do Tensor de saída for DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 ou DT_HALF, chame esta interface para recuperar os dados do Tensor de saída especificado.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: Um array unidimensional achatado a partir da saída TensorData do modelo.

List<Double> getDoubleVals(String outputName)

  • Obtém os dados do Tensor de saída especificado se o DataType do Tensor de saída for DT_DOUBLE ou DT_COMPLEX128.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: Um array unidimensional resultante do achatamento da saída TensorData do modelo.

List<Integer> getIntVals(String outputName)

  • Obtém os dados do Tensor de saída especificado se seu DataType for DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 ou DT_UINT16.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: A saída TensorData do modelo, achatada em um array unidimensional.

List<String> getStringVals(String outputName)

  • Se o DataType de um Tensor de saída for DT_STRING, chame esta interface para obter os dados desse Tensor.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: Um array unidimensional criado pelo achatamento da saída TensorData do modelo.

List<Long> getInt64Vals(String outputName)

  • Se o DataType do Tensor de saída for DT_INT64, chame esta interface para obter os dados do Tensor de saída especificado.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: Um array unidimensional obtido pelo achatamento da saída TensorData do modelo.

List<Boolean> getBoolVals(String outputName)

  • Recupera os dados do Tensor de saída especificado se seu DataType for DT_BOOL.

  • Parâmetro: outputName é o alias do tensor de saída.

  • Valor de retorno: O array unidimensional resultante do achatamento da saída TensorData do modelo.

Classe QueueClient

Interage com o serviço de fila do EAS para produzir, consumir e gerencie dados.

API

Descrição

QueueClient(String endpoint, String queueName, String token, HttpConfig httpConfig, QueueUser user)

  • Constrói uma instância de QueueClient.

  • Parâmetros:

    • endpoint: O endereço do endpoint do serviço de fila.

    • queueName: O nome do serviço de fila.

    • token: O token para acesso ao serviço.

    • httpConfig: A configuração da solicitação HTTP.

    • user: A configuração do usuário. Especifique UserId (um UUID aleatório por padrão) e GroupName (eas por padrão).

JSONObject attributes()

  • Obtém atributos detalhados do serviço de fila.

  • Retorno: Um JSONObject com informações da fila, incluindo os seguintes campos:

    • meta.maxPayloadBytes: O tamanho máximo permitido (em bytes) para um único item de dados.

    • meta.name: O nome da fila.

    • stream.approxMaxLength: O número máximo aproximado de itens que a fila pode armazenar.

    • stream.firstEntry: O índice do primeiro item na fila.

    • stream.lastEntry: O índice do último item na fila.

    • stream.length: O número atual de itens na fila.

Pair<Long, String> put(byte[] data, long priority, Map<String, String> tags)

  • Grava um item de dados na fila.

  • Parâmetros:

    • data: Os dados a serem gravados, como um array de bytes.

    • priority: A prioridade dos dados. 1 para alta prioridade, 0 para prioridade normal (padrão).

    • tags: Um mapa de tags personalizadas chave-valor.

  • Retorno: Um Pair<Long, String> contendo o index do novo item de dados e o request ID.

DataFrame[] get(long index, long length, long timeout, boolean autoDelete, Map<String, String> tags)

  • Recupera itens de dados da fila.

  • Parâmetros:

    • index: O índice inicial a partir do qual recuperar dados. Use -1 para ler os dados mais recentes.

    • length: O número de itens de dados a recuperar.

    • timeout: O período de timeout em segundos.

    • autoDelete: Se true, os dados são excluídos automaticamente da fila após serem recuperados.

    • tags: Um mapa de tags personalizadas chave-valor, como um RequestID.

  • Retorno: Um array de objetos DataFrame.

void truncate(Long index)

  • Exclua todos os itens de dados na fila com um índice menor que o index especificado.

String delete(Long index)

  • Exclua um item de dados específico da fila.

  • Parâmetro: index é o índice do item de dados a ser excluído.

  • Retorno: "OK" em caso de exclusão bem-sucedida.

JSONObject search(long index)

  • Consulta o status de um item de dados específico na fila.

  • Parâmetro: index é o índice do item de dados a ser consultado.

  • Retorno: Um JSONObject com informações de enfileiramento, incluindo:

    • ConsumerId: O ID da instância que está processando o item.

    • IsPending: true se o item estiver sendo processado; false se estiver aguardando na fila.

      • True significa que está sendo processado.

      • False significa que está enfileirado.

    • WaitCount: O número de itens à frente na fila. Válido apenas se IsPending for false. Se IsPending for true, este valor é 0.

    Exemplos de Resposta:

    • O serviço retorna {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2}, o que indica que a solicitação está sendo enfileirada.

    • O log mostra no data in stream e retorna {}. Isso indica que os dados não foram encontrados na fila. Pode ocorrer porque os dados já foram processados com sucesso pelo servidor e um resultado foi retornado, ou porque o parâmetro index está configurado incorretamente. Verifique e confirme.

Importante

Ao chamar search, defina o ID do grupo no objeto QueueUser como o nome do serviço. Caso contrário, IsPending no resultado da busca será sempre false.

  • Defina o ID do grupo como o nome do serviço:

    QueueUser u = new QueueUser(UUID.randomUUID().toString(), "<service_name>");
        QueueClient input_queue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), u);
  • Consulte o status para o índice especificado:

    System.out.println(input_queue.search(index));

WebSocketWatcher watch(long index, long window, boolean indexOnly, boolean autoCommit, Map<String, String> tags)

  • Assina o serviço de fila para receber itens de dados à medida que se tornam disponíveis.

  • Parâmetros:

    • index: O índice inicial. Use -1 para ignorar todos os dados pendentes e começar com os itens mais novos.

    • window: O tamanho da janela de envio (o número máximo de itens não confirmados). O serviço pausará o envio se o número de itens não confirmados atingir este tamanho de janela.

    • indexOnly: Se true, os objetos DataFrame retornados contêm apenas o índice e as tags, não o payload de dados, para economizar largura de banda.

    • autoCommit: Se true, os itens são confirmados automaticamente após o recebimento, e a chamada commit() não é necessária. Quando autoCommit é definido como true, o parâmetro window é ignorado.

    • tags: Um mapa de parâmetros personalizados para a solicitação de assinatura.

  • Retorno: Um objeto WebSocketWatcher para receber os dados assinados. Consulte o exemplo de serviço de fila para detalhes de uso.

String commit(Long index) ouString commit(Long[] index)

  • Confirma que um ou mais itens de dados foram consumidos, o que os exclui da fila.

  • Retorno: "OK" em caso de confirmação bem-sucedida.

void end(boolean force)

Fecha a conexão com o serviço de fila.

Classe DataFrame

Um wrapper para um item de dados do serviço de fila.

API

Descrição

byte[] getData()

  • Obtém o payload de dados.

  • Retorno: Os dados como um array de bytes.

long getIndex()

  • Obtém o índice do item de dados.

  • Retorno: O índice dos dados como um long.

Map<String, String> getTags()

  • Obtém as tags associadas ao item de dados.

  • Valor de retorno: Um objeto Map<String,String> chamado Tags, que pode ser usado para obter o RequestID. Por exemplo, df.getTags().get("requestId").

Exemplos de código

Exemplos de inferência síncrona

Escolha o exemplo correspondente ao formato de entrada e saída do seu serviço.

String

Se você implantou um serviço com um processor personalizado, normalmente usa strings para chamá-lo. Essa prática é comum para serviços de modelo PMML, conforme mostra o exemplo a seguir.

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;

public class TestString {
    public static void main(String[] args) throws Exception {
        // Initialize the client. The client object should be shared. Do not create a new client object for each request.
        PredictClient client = new PredictClient(new HttpConfig());
        client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
        // To use a direct network connection, call the setDirectEndpoint method.
        // Example: client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // To enable a direct network connection, you must enable it in the EAS console and provide the source vSwitch used to access the EAS service. This bypasses the gateway, allowing you to directly access service instances via software load balancing for improved stability and performance.
        // Note: For standard gateway access, use the endpoint that starts with your user ID. You can find this endpoint in the "Call Information" of the service in the EAS console. For direct network connections, use a domain name in the format 182848887922****.vpc.{region_id}.aliyuncs.com.
        client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
        client.setModelName("scorecard_pmml_example");

        // Define the input string.
        String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
        System.out.println(request);

        // Get the response string from EAS.
        try {
            String response = client.predict(request);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Shut down the client.
        client.shutdown();
        return;
    }
}

TensorFlow

Se você usar um modelo TensorFlow, utilize as classes TFRequest e TFResponse para entrada e saída, conforme demonstra o exemplo a seguir.

import java.util.List;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;

public class TestTF {
    public static TFRequest buildPredictRequest() {
        TFRequest request = new TFRequest();
        request.setSignatureName("predict_images");
        float[] content = new float[784];
        for (int i = 0; i < content.length; i++) {
            content[i] = (float) 0.0;
        }
        request.addFeed("images", TFDataType.DT_FLOAT, new long[]{1, 784}, content);
        request.addFetch("scores");
        return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());

        // To use a direct network connection, call the setDirectEndpoint method. The endpoint format is {uid}.vpc.{region_id}.aliyuncs.com.
        // client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // For standard gateway access, use the endpoint that starts with your user ID. You can find this endpoint in the "Call Information" of the service in the EAS console.
        client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
        client.setModelName("mnist_saved_model_example");
        client.setToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****");
        long startTime = System.currentTimeMillis();
        int count = 1000;
        for (int i = 0; i < count; i++) {
            try {
                TFResponse response = client.predict(buildPredictRequest());
                List<Float> result = response.getFloatVals("scores");
                System.out.print("Predict Result: [");
                for (int j = 0; j < result.size(); j++) {
                    System.out.print(result.get(j).floatValue());
                    if (j != result.size() - 1) {
                        System.out.print(", ");
                    }
                }
                System.out.print("]\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");
        client.shutdown();
    }
}

Exemplo de serviço de fila

Para acessar o serviço de fila, use a interface QueueClient. O exemplo a seguir mostra como fazer isso.

import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.QueueClient;
import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
import com.aliyun.openservices.eas.predict.queue_client.WebSocketWatcher;

public class DemoWatch {
    public static void main(String[] args) throws Exception {
        /** Create a queue service client. */
        String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
        String inputQueueName = "test_queue_service";
        String sinkQueueName = "test_queue_service/sink";
        String queueToken = "test-token";

        /** The input queue. The inference service automatically reads request data from this queue. */
        QueueClient inputQueue =
            new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** The output queue. After the inference service processes the input data, it writes the results to this queue. */
        QueueClient sinkQueue =
            new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** Clear queue data. Use with caution. */
        inputQueue.clear();
        sinkQueue.clear();

        /** Add data to the input queue. */
        int count = 10;
        for (int i = 0; i < count; ++i) {
            String data = Integer.toString(i);
            inputQueue.put(data.getBytes(), null);
            /** The queue service supports multiple priorities. You can use the put method to set the data priority. The default priority is 0. */
            //  inputQueue.put(data.getBytes(), 0L, null);
        }

        /** Use the watch method to subscribe to data from the output queue. The window size is 5. */
        WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null);
        /** Use the WatchConfig parameter to customize the number of retries, retry interval (in seconds), and whether to retry indefinitely. If you do not configure WatchConfig, the system defaults to 3 retries with a 5-second interval. */
        //  WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(3, 1));
        //  WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(true, 10));

        /** Get the output data. */
        for (int i = 0; i < count; ++i) {
            try {
                /** The getDataFrame() method retrieves DataFrame data. This call blocks until data is available. */
                byte[] data = watcher.getDataFrame().getData();
                System.out.println("[watch] data = " + new String(data));
            } catch (RuntimeException ex) {
                System.out.println("[watch] error = " + ex.getMessage());
                break;
            }
        }
        /** Close the watcher object. Each client instance supports only one watcher object. If you do not close the watcher, an error occurs on the next run. */
        watcher.close();

        Thread.sleep(2000);
        JSONObject attrs = sinkQueue.attributes();
        System.out.println(attrs.toString());

        /** Shut down the clients. */
        inputQueue.shutdown();
        sinkQueue.shutdown();
    }
}

A chamada de um serviço com o Java SDK envolve as seguintes etapas:

  1. Use a interface QueueClient para criar um objeto cliente do serviço de fila. Se você criar um serviço de inferência, também deverá criar objetos de fila de entrada e fila de saída.

  2. Use a função put() para enviar dados para a fila de entrada e a função watch() para assinar dados da fila de saída.

    Nota

    Em um ambiente de produção, use threads separadas para enviar dados e assinar dados. Para fins de demonstração, este exemplo executa essas operações na mesma thread.

Compactação de dados de solicitação

Para solicitações com grande volume de dados, o EAS suporta compactação usando o formato Zlib ou Gzip antes do envio ao servidor. Para ativar esse recurso, especifique rpc.decompressor na configuração do serviço.

A configuração do serviço é a seguinte:

"metadata": {
  "rpc": {
    "decompressor": "zlib"
  }
}

Segue um exemplo de código:

package com.aliyun.openservices.eas.predict;
import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
public class TestString {
    public static void main(String[] args) throws Exception{
    	  // Initialize the client.
        PredictClient client = new PredictClient(new HttpConfig());
        client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("echo_compress");
        client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
        // You can also use Compressor.Gzip.
        client.setCompressor(Compressor.Zlib);
        // Define the input string.
        String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
        System.out.println(request);
        // Get the response string from EAS.
        String response = client.predict(request);
        System.out.println(response);
        // Shut down the client.
        client.shutdown();
        return;
    }
}

Solução de problemas

Para solucionar problemas de exceções de invocação do Java SDK, incluindo problemas comuns de autenticação, roteamento, conexão e erros do lado do servidor, consulte a seção "Solução de Problemas de Exceções de Invocação" em SDK de Invocação de Serviço.

Para obter uma lista completa de códigos de status de serviço, significados de mensagens de erro e ações recomendadas, consulte Apêndice: Códigos de Status de Serviço e Erros Comuns.