Todos los productos
Search
Centro de documentos

Platform For AI:Java SDK

Última actualización: Sep 04, 2026

Esta guía explica cómo utilizar el SDK de Java para invocar servicios de modelos de Elastic Algorithm Service (EAS), y proporciona ejemplos de entrada y salida, así como un programa de muestra.

Nota

Para conocer los casos de uso y los principios del SDK, consulte service invocation SDK.

Requisitos previos

Para usar el SDK de Java de EAS en su proyecto Maven, agregue la dependencia eas-sdk en la sección <dependencies> de su archivo pom.xml. Para obtener la versión más reciente, consulte el repositorio de Maven.

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

El SDK de EAS versión 2.0.5 y posteriores incluye la funcionalidad de cliente QueueService para el servicio de cola asíncrona con prioridades múltiples. Para utilizar esta función y evitar conflictos de dependencias, agregue las dos dependencias siguientes y ajuste sus versiones según sea necesario:

<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>

Inicio rápido

Para realizar una llamada de servicio con el SDK de Java, siga estos tres pasos:

  1. Obtenga la información de llamada: En la página de detalles del servicio dentro de la consola de EAS, vaya a la pestaña Call Information para obtener el endpoint, el nombre del servicio y el token.

  2. Elija un tipo de solicitud y escriba el código: Seleccione la clase Request/Response adecuada según el formato de datos de entrada de su modelo y, a continuación, escriba su código con base en el ejemplo mínimo que se presenta a continuación.

    Nota

    Si desplegó su servicio con un Processor integrado, el SDK proporciona las clases de entrada y salida correspondientes. Por ejemplo, al TensorFlow Processor integrado le corresponde TFRequest. Para más información, consulte la documentación de cada processor en Built-in Processors.

  3. Ejecute y compruebe: Ejecute el programa cliente y compruebe la respuesta. Si ocurre un error, consulte la guía Troubleshooting.

El siguiente código es un ejemplo integral mínimo de una solicitud de cadena. Para ver más ejemplos, consulte Program Examples:

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();
    }
}

Referencia de la API

El SDK de Java proporciona las siguientes clases:

Grupo

Descripción de la clase

Clase cliente principal

PredictClient: Clase principal para configurar los detalles del servicio, como el endpoint y el token, así como para enviar solicitudes y recibir respuestas.

Configuración de conexión

HttpConfig: Configura los parámetros de conexión HTTP, como los tiempos de espera y el número máximo de conexiones.

Entrada/salida

  • TFRequest: Encapsula una solicitud para un modelo de TensorFlow.

  • TFResponse: Analiza la respuesta de un modelo de TensorFlow.

  • Para escenarios basados en cadenas, no es necesario usar clases de solicitud o respuesta dedicadas. Los datos se pueden pasar y recibir directamente como objetos String.

  • Para obtener más información sobre otros tipos compatibles, consulte el SDK.

Servicio de cola

  • QueueClient: Cliente de cola asíncrono para enviar datos y suscribirse a ellos. Esta clase requiere dependencias adicionales, tal como se describe en Requisitos previos.

  • DataFrame: Objeto que encapsula un elemento de datos del servicio de cola.

Clase PredictClient

Clase cliente principal. Configura la información del servicio, envía solicitudes y recibe resultados de predicción.

API

Descripción

PredictClient(HttpConfig httpConfig)

  • Construye una instancia de PredictClient.

  • Parámetro: httpConfig es una instancia de la clase HttpConfig.

void setToken(String token)

  • Establece el token de autenticación para las solicitudes HTTP.

  • Parámetro: token es el token de autenticación para acceder al servicio.

void setModelName(String modelName)

  • Establece el nombre del modelo para el servicio de predicción en línea.

  • Parámetro: modelName es el nombre del modelo que se utilizará.

void setEndpoint(String endpoint)

  • Función: Especifica el host y el puerto del servicio solicitado. El formato es "host:port".

  • Parámetro: endpoint es la dirección del endpoint del servicio en formato "host:port".

void setDirectEndpoint(String endpoint)

  • Establece el endpoint para acceder al servicio mediante una conexión directa VPC.

  • Parámetro: endpoint es la dirección del endpoint del servicio.

void setRequestPath(String requestPath)

  • Establece la ruta de la solicitud según se define en el código del lado del servidor.

  • Parámetro: requestPath es la ruta de la solicitud en el lado del servidor. Ejemplo: client.setRequestPath("/custom_path").

void setRetryCount(int retryCount)

  • Establece el número de reintentos para solicitudes con errores.

  • Parámetro: retryCount es el número de reintentos.

void setRetryConditions(EnumSet retryConditions)

  • Establece las condiciones para reintentar una solicitud. Este método se puede usar junto con setRetryCount. De forma predeterminada, se reintentan todos los errores de solicitud. Este método permite especificar que solo se reintenten ciertos errores.

  • Parámetro: retryConditions es un EnumSet que contiene una o más condiciones de reintento. Las condiciones compatibles incluyen:

    • RetryCondition.CONNECTION_FAILED: La conexión de la solicitud falló.

    • RetryCondition.CONNECTION_TIMEOUT: Se agotó el tiempo de espera de la conexión de la solicitud.

    • RetryCondition.READ_TIMEOUT: Se agotó el tiempo de espera de la solicitud mientras se esperaba una respuesta.

    • RetryCondition.RESPONSE_5XX: El servidor devolvió un código de estado 5xx.

    • RetryCondition.RESPONSE_4XX: El servidor devolvió un código de estado 4xx.

  • Ejemplo:

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

    Este ejemplo especifica que una solicitud se reintenta solo si se agota el tiempo de espera o si el servidor devuelve un código de estado 5xx.

void setContentType(String contentType)

  • Establece el Content-Type para la solicitud HTTP. El valor predeterminado es "application/octet-stream".

  • Parámetro: contentType es el tipo de contenido del flujo de datos que se envía.

void setUrl(String url)

Establece una URL de solicitud personalizada.

void setCompressor(Compressor compressor)

  • Establece el método de compresión para los datos de la solicitud.

  • Parámetro: compressor es el método de compresión. Los valores compatibles son Compressor.Gzip y Compressor.Zlib.

  • Para obtener más información, consulte Request Data Compression Example.

void addExtraHeaders(Map<String, String> extraHeaders)

  • Agrega encabezados HTTP personalizados a la solicitud.

  • Parámetro: extraHeaders es un Map<String, String> de encabezados HTTP por agregar.

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

  • Crea un cliente secundario que comparte el pool de hilos del cliente principal. Esto resulta útil para predicciones multiproceso.

  • Parámetros:

    • token: El token de autenticación para el servicio.

    • endpoint: El endpoint del servicio.

    • modelName: El nombre del modelo.

void predict(TFRequest runRequest)

  • Envía una solicitud de TensorFlow al servicio de predicción en línea.

  • Parámetro: runRequest es una instancia de un objeto TFRequest.

void predict(String requestContent)

  • Envía una solicitud basada en cadenas al servicio de predicción en línea.

  • Parámetro: requestContent es el contenido de la solicitud como cadena.

void predict(byte[] requestContent)

  • Envía una solicitud de matriz de bytes al servicio de predicción en línea.

  • Parámetro: requestContent es el contenido de la solicitud como matriz de bytes.

Clase HttpConfig

Configura los parámetros subyacentes de conexión HTTP, como los tiempos de espera, el recuento de hilos y el pool de conexiones.

API

Descripción

void setIoThreadNum(int ioThreadNum)

  • Establece el número de hilos de E/S para las solicitudes HTTP. El valor predeterminado es 2.

  • Parámetro: ioThreadNum es el número de hilos de E/S.

void setReadTimeout(int readTimeout)

  • Tiempo máximo de espera para recibir un paquete de datos del servidor después de establecer una conexión. El valor predeterminado es 5000 (5 segundos).

  • Parámetro: readTimeout es el tiempo de espera de lectura en milisegundos.

Importante

Este tiempo de espera aplica únicamente después de establecer la conexión. Es diferente del tiempo de espera de solicitud configurado mediante el método setRequestTimeout.

void setRequestTimeout(int requestTimeout)

  • Tiempo total permitido para una solicitud, desde el envío hasta la recepción completa de la respuesta. El valor predeterminado es 5000 (5 segundos).

  • Parámetro: requestTimeout es el tiempo de espera de la solicitud en milisegundos.

Importante

Este tiempo de espera abarca todo el ciclo de vida de la solicitud, incluido el establecimiento de la conexión, la transferencia de datos y el procesamiento en el servidor. Es diferente del tiempo de espera de lectura configurado mediante el método setReadTimeout.

void setConnectTimeout(int connectTimeout)

  • Tiempo máximo de espera al establecer una conexión. El valor predeterminado es 5000 (5 segundos).

  • Parámetro: connectTimeout es el tiempo de espera de conexión en milisegundos.

void setMaxConnectionCount(int maxConnectionCount)

  • Establece el número máximo total de conexiones en el pool de conexiones. El valor predeterminado es 1000.

  • Parámetro: maxConnectionCount es el número máximo de conexiones.

void setMaxConnectionPerRoute(int maxConnectionPerRoute)

  • Establece el número máximo de conexiones por ruta. El valor predeterminado es 1000.

  • Parámetro: maxConnectionPerRoute es el número máximo de conexiones para cada ruta.

void setKeepAlive(boolean keepAlive)

  • Función: Configura el mecanismo keep-alive para el servicio HTTP.

  • Parámetro: keepAlive. Especifica si se debe habilitar el mecanismo keep-alive para la conexión. El valor predeterminado es true.

int getErrorCode()

Devuelve el código de estado de la última llamada a la API.

String getErrorMessage()

Devuelve el mensaje de estado de la última llamada a la API.

Clase TFRequest

Construye los datos de entrada para un modelo de TensorFlow.

API

Descripción

void setSignatureName(String value)

  • Función: Especifica el nombre de signatureDef para el modelo solicitado cuando este se encuentra en formato TensorFlow SavedModel.

  • Parámetro: Nombre de signatureDef para el modelo de la solicitud.

void addFetch(String value)

  • Especifica un tensor de salida que se obtendrá del modelo.

  • Parámetro: value es el alias del tensor de salida que se va a obtener.

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

  • Agrega un tensor de entrada a la solicitud.

  • Parámetros:

    • inputName: Alias del tensor de entrada.

    • dataType: Tipo de datos del tensor de entrada.

    • shape: Forma del tensor de entrada.

    • content: Contenido del tensor, proporcionado como una matriz unidimensional aplanada. El tipo de elemento en la matriz depende de dataType:

      Si el DataType del tensor de entrada es DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 o DT_HALF, el tipo de elemento en content es FLOAT. Cuando el DataType es DT_COMPLEX64, dos elementos FLOAT adyacentes en content representan las partes real e imaginaria de un número complejo, respectivamente.

      Si el DataType del tensor de entrada es DT_DOUBLE o DT_COMPLEX128, los elementos en content son de tipo DOUBLE. Cuando el DataType es DT_COMPLEX128, dos elementos DOUBLE adyacentes en content representan las partes real e imaginaria de un número complejo, respectivamente.

      Si el DataType del tensor de entrada es DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 o DT_UINT16, el tipo de elemento en content es INT.

      Si el DataType del tensor de entrada es DT_INT64, el tipo de elemento en content es LONG.

      Si el DataType del tensor de entrada es DT_STRING, el tipo de elemento en content es STRING.

      Si el DataType del tensor de entrada es DT_BOOL, el tipo de elemento en content es BOOLEAN.

Clase TFResponse

Analiza y accede a los datos de salida de una predicción de modelo de TensorFlow.

API

Descripción

List<Long> getTensorShape(String outputName)

  • Obtiene la forma de un tensor de salida específico.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: Una lista de valores long que representa la forma del tensor.

List<Float> getFloatVals(String outputName)

  • Función: Si el DataType del tensor de salida es DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 o DT_HALF, puede llamar a esta interfaz para recuperar los datos del tensor de salida especificado.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: Una matriz unidimensional aplanada a partir de la salida TensorData del modelo.

List<Double> getDoubleVals(String outputName)

  • Función: Obtiene los datos del tensor de salida especificado si su DataType es DT_DOUBLE o DT_COMPLEX128.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: Una matriz unidimensional resultante de aplanar la salida TensorData del modelo.

List<Integer> getIntVals(String outputName)

  • Función: Obtiene los datos del tensor de salida especificado si su DataType es DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 o DT_UINT16.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: La salida TensorData del modelo, aplanada en una matriz unidimensional.

List<String> getStringVals(String outputName)

  • Función: Si el DataType de un tensor de salida es DT_STRING, puede llamar a esta interfaz para obtener los datos de dicho tensor.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: Una matriz unidimensional creada al aplanar la salida TensorData del modelo.

List<Long> getInt64Vals(String outputName)

  • Función: Si el DataType del tensor de salida es DT_INT64, puede llamar a esta interfaz para obtener los datos del tensor de salida especificado.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: Una matriz unidimensional obtenida al aplanar la salida TensorData del modelo.

List<Boolean> getBoolVals(String outputName)

  • Función: Recupera los datos del tensor de salida especificado si su DataType es DT_BOOL.

  • Parámetro: outputName es el alias del tensor de salida.

  • Valor devuelto: La matriz unidimensional resultante de aplanar la salida TensorData del modelo.

Clase QueueClient

Interactúa con el servicio de cola de EAS para producir, consumir y gestionar datos.

API

Descripción

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

  • Construye una instancia de QueueClient.

  • Parámetros:

    • endpoint: Dirección del endpoint del servicio de cola.

    • queueName: Nombre del servicio de cola.

    • token: Token para acceder al servicio.

    • httpConfig: Configuración de la solicitud HTTP.

    • user: Configuración de usuario. Especifica UserId (un UUID aleatorio de forma predeterminada) y GroupName (eas de forma predeterminada).

JSONObject attributes()

  • Obtiene los atributos detallados del servicio de cola.

  • Valor devuelto: Un JSONObject con información de la cola, incluidos los siguientes campos:

    • meta.maxPayloadBytes: Tamaño máximo permitido (en bytes) para un solo elemento de datos.

    • meta.name: Nombre de la cola.

    • stream.approxMaxLength: Número máximo aproximado de elementos que puede almacenar la cola.

    • stream.firstEntry: Índice del primer elemento en la cola.

    • stream.lastEntry: Índice del último elemento en la cola.

    • stream.length: Número actual de elementos en la cola.

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

  • Escribe un elemento de datos en la cola.

  • Parámetros:

    • data: Datos que se escribirán, como matriz de bytes.

    • priority: Prioridad de los datos. 1 para prioridad alta, 0 para prioridad normal (predeterminado).

    • tags: Mapa de etiquetas personalizadas de clave-valor.

  • Valor devuelto: Un Pair<Long, String> que contiene el index del nuevo elemento de datos y el request ID.

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

  • Recupera elementos de datos de la cola.

  • Parámetros:

    • index: Índice inicial desde el cual recuperar datos. Use -1 para leer los datos más recientes.

    • length: Número de elementos de datos que se recuperarán.

    • timeout: Periodo de tiempo de espera en segundos.

    • autoDelete: Si es true, los datos se eliminan automáticamente de la cola después de recuperarse.

    • tags: Mapa de etiquetas personalizadas de clave-valor, como un RequestID.

  • Valor devuelto: Una matriz de objetos DataFrame.

void truncate(Long index)

  • Elimina todos los elementos de datos en la cola cuyo índice sea menor que el index especificado.

String delete(Long index)

  • Elimina un elemento de datos específico de la cola.

  • Parámetro: index es el índice del elemento de datos que se eliminará.

  • Valor devuelto: "OK" si la eliminación se realiza correctamente.

JSONObject search(long index)

  • Consulta el estado de un elemento de datos específico en la cola.

  • Parámetro: index es el índice del elemento de datos que se consultará.

  • Valor devuelto: Un JSONObject con información de la cola, que incluye:

    • ConsumerId: ID de la instancia que procesa el elemento.

    • IsPending: true si el elemento se está procesando; false si está en espera en la cola.

      • True significa que se está procesando.

      • False significa que está en la cola.

    • WaitCount: Número de elementos por delante en la cola. Esto es válido solo si IsPending es false. Si IsPending es true, este valor es 0.

    Respuestas de ejemplo:

    • El servicio devuelve {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2}, lo que indica que la solicitud está en cola.

    • El registro muestra no data in stream y devuelve {}. Esto indica que no se encontraron los datos en la cola. Puede deberse a que los datos ya fueron procesados correctamente por el servidor y se devolvió un resultado, o a que el parámetro index está configurado incorrectamente. Compruébelo y confírmelo.

Importante

Al llamar a search, debe establecer el ID de grupo en el objeto QueueUser con el nombre del servicio. De lo contrario, IsPending en el resultado de búsqueda siempre será false.

  • Establezca el ID de grupo con el nombre del servicio:

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

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

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

  • Se suscribe al servicio de cola para recibir elementos de datos a medida que estén disponibles.

  • Parámetros:

    • index: Índice inicial. Use -1 para ignorar todos los datos pendientes y comenzar con los elementos más recientes.

    • window: Tamaño de la ventana de envío (número máximo de elementos sin confirmar). El servicio pausará el envío si el número de elementos sin confirmar alcanza este tamaño de ventana.

    • indexOnly: Si es true, los objetos DataFrame devueltos contienen solo el índice y las etiquetas, no la carga útil de datos, para ahorrar ancho de banda.

    • autoCommit: Si es true, los elementos se confirman automáticamente al recibirse y no es necesaria la llamada a commit(). Cuando autoCommit se establece en true, se ignora el parámetro window.

    • tags: Mapa de parámetros personalizados para la solicitud de suscripción.

  • Valor devuelto: Un objeto WebSocketWatcher para recibir los datos suscritos. Consulte queue service example para obtener detalles de uso.

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

  • Confirma que uno o más elementos de datos se han consumido, lo que los elimina de la cola.

  • Valor devuelto: "OK" si la confirmación se realiza correctamente.

void end(boolean force)

Cierra la conexión con el servicio de cola.

Clase DataFrame

Contenedor para un elemento de datos del servicio de cola.

API

Descripción

byte[] getData()

  • Obtiene la carga útil de datos.

  • Valor devuelto: Los datos como matriz de bytes.

long getIndex()

  • Obtiene el índice del elemento de datos.

  • Valor devuelto: El índice de datos como long.

Map<String, String> getTags()

  • Obtiene las etiquetas asociadas con el elemento de datos.

  • Valor devuelto: Un objeto Map<String,String> llamado Tags, que se puede usar para obtener el RequestID. Por ejemplo, df.getTags().get("requestId").

Ejemplos de código

Ejemplos de inference síncrona

Elija el ejemplo que coincida con el formato de entrada y salida de su servicio.

String

Si desplegó un servicio con un procesador personalizado, normalmente se usan cadenas de texto para invocarlo. Esta práctica es común en servicios de modelos PMML, como se muestra en el siguiente ejemplo.

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

Si utiliza un modelo de TensorFlow, emplee las clases TFRequest y TFResponse para la entrada y la salida, tal como se demuestra en el siguiente ejemplo.

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();
    }
}

Ejemplo de servicio de cola

Para acceder al servicio de cola, utilice la interfaz QueueClient. A continuación se muestra cómo hacerlo.

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();
    }
}

La invocación de un servicio mediante el SDK de Java implica los siguientes pasos:

  1. Utilice la interfaz QueueClient para crear un objeto cliente del servicio de cola. Si crea un servicio de inference, también debe crear objetos de cola de entrada y de salida.

  2. Use la función put() para enviar datos a la cola de entrada y la función watch() para suscribirse a los datos de la cola de salida.

    Nota

    En un entorno de producción, se recomienda usar hilos separados para el envío y la suscripción de datos. Con fines demostrativos, este ejemplo realiza ambas operaciones en el mismo hilo.

Compresión de datos de solicitud

Para solicitudes que contienen una gran cantidad de datos, EAS admite la compresión mediante los formatos Zlib o Gzip antes de enviarlos al servidor. Para habilitar esta función, debe especificar rpc.decompressor en la configuración del servicio.

La configuración del servicio es la siguiente:

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

A continuación se presenta un ejemplo 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;
    }
}

Solución de problemas

Para resolver problemas relacionados con excepciones de invocación del SDK de Java, incluidos inconvenientes comunes de autenticación, enrutamiento, conexión y errores del servidor, consulte la sección "Solución de problemas de excepciones de invocación" en Service Invocation SDK.

Para obtener una lista completa de los códigos de estado del servicio, el significado de los mensajes de error y las acciones recomendadas, consulte Appendix: Service Status Codes and Common Errors.