Tous les produits
Search
Centre de documentation

Platform For AI:Java SDK

Dernière mise à jour :Aug 10, 2026

Ce guide explique comment utiliser le SDK Java pour appeler les services de modèle Elastic Algorithm Service (EAS). Il fournit des exemples d'entrées et de sorties ainsi qu'un exemple de programme.

Remarque

Pour en savoir plus sur les cas d'utilisation et les principes du SDK, reportez-vous à la rubrique SDK d'appel de service.

Prérequis

Pour utiliser le SDK Java EAS dans votre projet Maven, ajoutez la dépendance eas-sdk à la section <dependencies> de votre fichier pom.xml. Pour obtenir la dernière version, consultez le référentiel Maven.

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

Le SDK EAS 2.0.5 et versions ultérieures inclut la fonctionnalité de client QueueService pour le service de file d'attente asynchrone à priorités multiples. Pour utiliser cette fonctionnalité et éviter les conflits de dépendances, ajoutez les deux dépendances suivantes et ajustez leurs versions si nécessaire :

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

Démarrage rapide

Pour effectuer un appel de service avec le SDK Java, suivez ces trois étapes :

  1. Obtenir les informations d'appel : Sur la page des détails du service dans la console EAS, accédez à l'onglet Call Information pour récupérer le endpoint, le nom du service et le token.

  2. Choisir le type de requête et écrire le code : Sélectionnez la classe Request/Response appropriée en fonction du format des données d'entrée de votre modèle, puis rédigez votre code en vous basant sur l'exemple minimal ci-dessous.

    Remarque

    Si vous avez déployé votre service avec un built-in Processor, le SDK fournit les classes d'entrée et de sortie correspondantes. Par exemple, le TensorFlow Processor intégré correspond à TFRequest. Pour plus d'informations, consultez la documentation de chaque processeur dans la section Built-in Processors.

  3. Exécuter et vérifier : Exécutez le programme client et vérifiez la réponse. En cas d'erreur, reportez-vous au guide Dépannage.

Le code suivant constitue un exemple minimal de bout en bout pour une requête de type chaîne. Pour plus d'exemples, consultez la section Exemples de programmes :

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

Référence de l'API

Le SDK Java met à disposition les classes suivantes :

Groupe

Description de la classe

Classe cliente principale

PredictClient : Classe principale permettant de configurer les détails du service (endpoint et token), d'envoyer des requêtes et de recevoir des réponses.

Configuration de la connexion

HttpConfig : Configure les paramètres de connexion HTTP, tels que les délais d'expiration et le nombre maximal de connexions.

Entrées/sorties

  • TFRequest : Encapsule une requête destinée à un modèle TensorFlow.

  • TFResponse : Analyse la réponse renvoyée par un modèle TensorFlow.

  • Pour les scénarios basés sur des chaînes, il n'est pas nécessaire d'utiliser des classes de requête ou de réponse dédiées. Vous pouvez transmettre et recevoir les données directement sous forme d'objets String.

  • Pour plus d'informations sur les autres types pris en charge, reportez-vous au SDK.

Service de file d'attente

  • QueueClient : Client de file d'attente asynchrone utilisé pour envoyer des données et s'y abonner. Cette classe nécessite des dépendances supplémentaires, comme indiqué dans la section Prérequis.

  • DataFrame : Objet qui encapsule un élément de données issu du service de file d'attente.

Classe PredictClient

Il s'agit de la classe cliente principale. Elle permet de configurer les informations du service, d'envoyer des requêtes et de recevoir les résultats de prédiction.

API

Description

PredictClient(HttpConfig httpConfig)

  • Construit une instance de PredictClient.

  • Paramètre : httpConfig est une instance de la classe HttpConfig.

void setToken(String token)

  • Définit le token d'authentification pour les requêtes HTTP.

  • Paramètre : token correspond au token d'authentification pour l'accès au service.

void setModelName(String modelName)

  • Définit le nom du modèle pour le service de prédiction en ligne.

  • Paramètre : modelName indique le nom du modèle à utiliser.

void setEndpoint(String endpoint)

  • Fonction : Spécifie l'hôte et le port du service demandé. Le format attendu est "host:port".

  • Paramètre : endpoint représente l'adresse du point de terminaison du service au format "host:port".

void setDirectEndpoint(String endpoint)

  • Définit le endpoint pour accéder au service via une connexion directe VPC.

  • Paramètre : endpoint correspond à l'adresse du point de terminaison du service.

void setRequestPath(String requestPath)

  • Définit le chemin de la requête tel qu'il est défini dans le code côté serveur.

  • Paramètre : requestPath correspond au chemin de la requête côté serveur. Exemple : client.setRequestPath("/custom_path").

void setRetryCount(int retryCount)

  • Définit le nombre de tentatives pour les requêtes ayant échoué.

  • Paramètre : retryCount indique le nombre de tentatives.

void setRetryConditions(EnumSet retryConditions)

  • Définit les conditions de nouvelle tentative d'une requête. Vous pouvez utiliser cette méthode conjointement avec la méthode setRetryCount. Par défaut, toutes les erreurs de requête font l'objet d'une nouvelle tentative. Cette méthode vous permet de spécifier que seules certaines erreurs de requête doivent être retentées.

  • Paramètre : retryConditions est un EnumSet contenant une ou plusieurs conditions de nouvelle tentative. Les conditions prises en charge incluent :

    • RetryCondition.CONNECTION_FAILED : Échec de la connexion de la requête.

    • RetryCondition.CONNECTION_TIMEOUT : Délai d'expiration de la connexion de la requête atteint.

    • RetryCondition.READ_TIMEOUT : Délai d'expiration atteint lors de l'attente d'une réponse.

    • RetryCondition.RESPONSE_5XX : Le serveur a renvoyé un code d'état 5xx.

    • RetryCondition.RESPONSE_4XX : Le serveur a renvoyé un code d'état 4xx.

  • Exemple :

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

    Cet exemple spécifie qu'une requête n'est retentée qu'en cas de délai d'expiration ou si le serveur renvoie un code d'état 5xx.

void setContentType(String contentType)

  • Définit le Content-Type de la requête HTTP. La valeur par défaut est "application/octet-stream".

  • Paramètre : contentType correspond au type de contenu du flux de données envoyé.

void setUrl(String url)

Définit une URL de requête personnalisée.

void setCompressor(Compressor compressor)

  • Définit la méthode de compression pour les données de la requête.

  • Paramètre : compressor correspond à la méthode de compression. Les valeurs prises en charge sont Compressor.Gzip et Compressor.Zlib.

  • Pour plus d'informations, consultez l'exemple de compression des données de requête.

void addExtraHeaders(Map<String, String> extraHeaders)

  • Ajoute des en-têtes HTTP personnalisés à la requête.

  • Paramètre : extraHeaders est une Map<String, String> des en-têtes HTTP à ajouter.

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

  • Crée un client enfant qui partage le pool de threads du client parent. Cette approche est utile pour les prédictions multithread.

  • Paramètres :

    • token : Token d'authentification pour le service.

    • endpoint : Point de terminaison du service.

    • modelName : Nom du modèle.

void predict(TFRequest runRequest)

  • Envoie une requête TensorFlow au service de prédiction en ligne.

  • Paramètre : runRequest est une instance d'un objet TFRequest.

void predict(String requestContent)

  • Envoie une requête basée sur une chaîne au service de prédiction en ligne.

  • Paramètre : requestContent correspond au contenu de la requête sous forme de chaîne.

void predict(byte[] requestContent)

  • Envoie une requête sous forme de tableau d'octets au service de prédiction en ligne.

  • Paramètre : requestContent correspond au contenu de la requête sous forme de tableau d'octets.

Classe HttpConfig

Cette classe configure les paramètres sous-jacents de la connexion HTTP, tels que les délais d'attente, le nombre de threads et le pool de connexions.

API

Description

void setIoThreadNum(int ioThreadNum)

  • Définit le nombre de threads d'E/S pour les requêtes HTTP. La valeur par défaut est 2.

  • Paramètre : ioThreadNum correspond au nombre de threads d'E/S.

void setReadTimeout(int readTimeout)

  • Délai maximal d'attente d'un paquet de données en provenance du serveur une fois la connexion établie. La valeur par défaut est 5000 (5 secondes).

  • Paramètre : readTimeout représente le délai de lecture en millisecondes.

Important

Ce délai s'applique uniquement après l'établissement de la connexion. Il diffère du délai d'expiration de la requête défini par la méthode setRequestTimeout.

void setRequestTimeout(int requestTimeout)

  • Durée totale autorisée pour une requête, de l'envoi à la réception de la réponse complète. La valeur par défaut est 5000 (5 secondes).

  • Paramètre : requestTimeout correspond au délai d'expiration de la requête en millisecondes.

Important

Ce délai couvre l'intégralité du cycle de vie de la requête, y compris l'établissement de la connexion, le transfert des données et le traitement côté serveur. Il diffère du délai de lecture défini par la méthode setReadTimeout.

void setConnectTimeout(int connectTimeout)

  • Délai maximal d'attente lors de l'établissement d'une connexion. La valeur par défaut est 5000 (5 secondes).

  • Paramètre : connectTimeout représente le délai de connexion en millisecondes.

void setMaxConnectionCount(int maxConnectionCount)

  • Définit le nombre total maximal de connexions dans le pool de connexions. La valeur par défaut est 1000.

  • Paramètre : maxConnectionCount correspond au nombre maximal de connexions.

void setMaxConnectionPerRoute(int maxConnectionPerRoute)

  • Définit le nombre maximal de connexions par route. La valeur par défaut est 1000.

  • Paramètre : maxConnectionPerRoute correspond au nombre maximal de connexions pour chaque route.

void setKeepAlive(boolean keepAlive)

  • Fonction : Configure le paramètre keep-alive pour le service HTTP.

  • Paramètre : keepAlive. Indique s'il faut activer le mécanisme keep-alive pour la connexion. La valeur par défaut est true.

int getErrorCode()

Renvoie le code d'état du dernier appel d'API.

String getErrorMessage()

Renvoie le message d'état du dernier appel d'API.

Classe TFRequest

Construit les données d'entrée pour un modèle TensorFlow.

API

Description

void setSignatureName(String value)

  • Fonction : Spécifie le nom de la signatureDef pour le modèle demandé lorsque celui-ci est au format TensorFlow SavedModel.

  • Paramètre : Nom de la signatureDef pour le modèle de requête.

void addFetch(String value)

  • Spécifie un tenseur de sortie à récupérer depuis le modèle.

  • Paramètre : value correspond à l'alias du tenseur de sortie à récupérer.

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

  • Ajoute un tenseur d'entrée à la requête.

  • Paramètres :

    • inputName : Alias du tenseur d'entrée.

    • dataType : Type de données du tenseur d'entrée.

    • shape : Forme du tenseur d'entrée.

    • content : Contenu du tenseur, fourni sous forme de tableau unidimensionnel aplati. Le type d'élément dans le tableau dépend du dataType :

      Si le DataType du tenseur d'entrée est DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 ou DT_HALF, le type d'élément dans content est FLOAT. Lorsque le DataType est DT_COMPLEX64, deux éléments FLOAT adjacents dans content représentent respectivement les parties réelle et imaginaire d'un nombre complexe.

      Si le DataType du tenseur d'entrée est DT_DOUBLE ou DT_COMPLEX128, les éléments dans content sont de type DOUBLE. Lorsque le DataType est DT_COMPLEX128, deux éléments DOUBLE adjacents dans content représentent respectivement les parties réelle et imaginaire d'un nombre complexe.

      Si le DataType du tenseur d'entrée est DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 ou DT_UINT16, le type d'élément dans content est INT.

      Si le DataType du tenseur d'entrée est DT_INT64, le type d'élément dans content est LONG.

      Si le DataType du tenseur d'entrée est DT_STRING, le type d'élément dans content est STRING.

      Si le DataType du tenseur d'entrée est DT_BOOL, le type d'élément dans content est BOOLEAN.

Classe TFResponse

Analyse et accède aux données de sortie issues d'une prédiction de modèle TensorFlow.

API

Description

List<Long> getTensorShape(String outputName)

  • Récupère la forme d'un tenseur de sortie spécifié.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Une liste de valeurs Long représentant la forme du tenseur.

List<Float> getFloatVals(String outputName)

  • Fonction : Si le DataType du tenseur de sortie est DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16 ou DT_HALF, vous pouvez appeler cette interface pour récupérer les données du tenseur de sortie spécifié.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Un tableau unidimensionnel aplati issu de la sortie TensorData du modèle.

List<Double> getDoubleVals(String outputName)

  • Fonction : Obtient les données du tenseur de sortie spécifié si le DataType du tenseur de sortie est DT_DOUBLE ou DT_COMPLEX128.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Un tableau unidimensionnel résultant de l'aplatissement de la sortie TensorData du modèle.

List<Integer> getIntVals(String outputName)

  • Fonction : Obtient les données du tenseur de sortie spécifié si son DataType est DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16 ou DT_UINT16.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : La sortie TensorData du modèle, aplatie en un tableau unidimensionnel.

List<String> getStringVals(String outputName)

  • Fonction : Si le DataType d'un tenseur de sortie est DT_STRING, vous pouvez appeler cette interface pour obtenir les données de ce tenseur.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Un tableau unidimensionnel créé par l'aplatissement de la sortie TensorData du modèle.

List<Long> getInt64Vals(String outputName)

  • Fonction : Si le DataType du tenseur de sortie est DT_INT64, vous pouvez appeler cette interface pour obtenir les données du tenseur de sortie spécifié.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Un tableau unidimensionnel obtenu par l'aplatissement de la sortie TensorData du modèle.

List<Boolean> getBoolVals(String outputName)

  • Fonction : Récupère les données du tenseur de sortie spécifié si son DataType est DT_BOOL.

  • Paramètre : outputName correspond à l'alias du tenseur de sortie.

  • Valeur de retour : Le tableau unidimensionnel résultant de l'aplatissement de la sortie TensorData du modèle.

Classe QueueClient

Cette classe interagit avec le service de file d'attente EAS pour produire, consommer et gérer les données.

API

Description

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

  • Construit une instance de QueueClient.

  • Paramètres :

    • endpoint : adresse du endpoint du service de file d'attente.

    • queueName : nom du service de file d'attente.

    • token : jeton d'accès au service.

    • httpConfig : configuration des requêtes HTTP.

    • user : configuration utilisateur. Spécifiez UserId (un UUID aléatoire par défaut) et GroupName (eas par défaut).

JSONObject attributes()

  • Récupère les attributs détaillés du service de file d'attente.

  • Valeur renvoyée : un objet JSONObject contenant les informations sur la file d'attente, incluant les champs suivants :

    • meta.maxPayloadBytes : taille maximale autorisée (en octets) pour un seul élément de données.

    • meta.name : nom de la file d'attente.

    • stream.approxMaxLength : nombre maximal approximatif d'éléments que la file peut stocker.

    • stream.firstEntry : index du premier élément de la file.

    • stream.lastEntry : index du dernier élément de la file.

    • stream.length : nombre actuel d'éléments dans la file.

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

  • Écrit un élément de données dans la file d'attente.

  • Paramètres :

    • data : données à écrire sous forme de tableau d'octets.

    • priority : priorité des données. Utilisez 1 pour une haute priorité ou 0 pour une priorité normale (valeur par défaut).

    • tags : mappe de paires clé-valeur personnalisées.

  • Valeur renvoyée : un objet Pair<Long, String> contenant l'index du nouvel élément de données et l'ID de requête.

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

  • Récupère des éléments de données depuis la file d'attente.

  • Paramètres :

    • index : index de départ à partir duquel récupérer les données. Utilisez -1 pour lire les dernières données.

    • length : nombre d'éléments de données à récupérer.

    • timeout : délai d'expiration en secondes.

    • autoDelete : si la valeur est true, les données sont automatiquement supprimées de la file après récupération.

    • tags : mappe de paires clé-valeur personnalisées, telles qu'un RequestID.

  • Valeur renvoyée : un tableau d'objets DataFrame.

void truncate(Long index)

  • Supprime tous les éléments de données de la file dont l'index est inférieur à la valeur index spécifiée.

String delete(Long index)

  • Supprime un élément de données spécifique de la file d'attente.

  • Paramètre : index correspond à l'index de l'élément de données à supprimer.

  • Valeur renvoyée : « OK » en cas de suppression réussie.

JSONObject search(long index)

  • Interroge le statut d'un élément de données spécifique dans la file d'attente.

  • Paramètre : index correspond à l'index de l'élément de données à interroger.

  • Valeur renvoyée : un objet JSONObject contenant les informations de mise en file, notamment :

    • ConsumerId : ID de l'instance qui traite l'élément.

    • IsPending : true si l'élément est en cours de traitement ; false s'il attend dans la file.

      • True signifie que l'élément est en cours de traitement.

      • False signifie que l'élément est en attente dans la file.

    • WaitCount : nombre d'éléments situés avant celui-ci dans la file. Cette valeur n'est valide que si IsPending est défini sur false. Si IsPending est défini sur true, cette valeur est 0.

    Exemples de réponses :

    • Le service renvoie {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2}, ce qui indique que la requête est mise en file d'attente.

    • Le journal affiche no data in stream et renvoie {}. Cela signifie que les données n'ont pas été trouvées dans la file. Les données ont peut-être été traitées avec succès côté serveur et un résultat a déjà été renvoyé, ou le paramètre index est mal configuré. Veuillez vérifier et confirmer.

Important

Lorsque vous appelez search, vous devez définir l'ID de groupe dans l'objet QueueUser sur le nom du service. Sinon, la valeur IsPending dans le résultat de recherche sera toujours false.

  • Définissez l'ID de groupe sur le nom du service :

    QueueUser u = new QueueUser(UUID.randomUUID().toString(), "<service_name>");
        QueueClient input_queue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), u);
  • Interrogez le statut pour l'index spécifié :

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

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

  • S'abonne au service de file d'attente pour recevoir les éléments de données dès qu'ils deviennent disponibles.

  • Paramètres :

    • index : index de départ. Utilisez -1 pour ignorer toutes les données en attente et commencer par les éléments les plus récents.

    • window : taille de la fenêtre d'envoi (nombre maximal d'éléments non validés). Le service suspend l'envoi si le nombre d'éléments non validés atteint cette taille de fenêtre.

    • indexOnly : si la valeur est true, les objets DataFrame renvoyés ne contiennent que l'index et les tags, sans la charge utile des données, afin d'économiser de la bande passante.

    • autoCommit : si la valeur est true, les éléments sont automatiquement validés à leur réception et l'appel à commit() n'est pas nécessaire. Lorsque autoCommit est défini sur true, le paramètre window est ignoré.

    • tags : mappe de paramètres personnalisés pour la requête d'abonnement.

  • Valeur renvoyée : un objet WebSocketWatcher permettant de recevoir les données abonnées. Consultez l'exemple de service de file d'attente pour plus de détails sur l'utilisation.

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

  • Confirme la consommation d'un ou plusieurs éléments de données, ce qui les supprime de la file d'attente.

  • Valeur renvoyée : « OK » en cas de validation réussie.

void end(boolean force)

Ferme la connexion au service de file d'attente.

Classe DataFrame

Wrapper pour un élément de données issu du service de file d'attente.

API

Description

byte[] getData()

  • Récupère la charge utile des données.

  • Valeur renvoyée : les données sous forme de tableau d'octets.

long getIndex()

  • Récupère l'index de l'élément de données.

  • Valeur renvoyée : l'index des données sous forme de long.

Map<String, String> getTags()

  • Récupère les tags associés à l'élément de données.

  • Valeur renvoyée : un objet Map<String,String> nommé Tags, qui permet d'obtenir le RequestID. Par exemple, df.getTags().get("requestId").

Exemples de code

Exemples d'inférence synchrone

Choisissez l'exemple qui correspond au format d'entrée et de sortie de votre service.

String

Si vous avez déployé un service avec un processeur personnalisé, vous utilisez généralement des chaînes de caractères pour l'appeler. Cette pratique est courante pour les services de modèles PMML, comme le montre l'exemple suivant.

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 vous utilisez un modèle TensorFlow, servez-vous des classes TFRequest et TFResponse pour les entrées et les sorties, comme l'illustre l'exemple ci-dessous.

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

Exemple de service de file d'attente

Pour accéder au service de file d'attente, utilisez l'interface QueueClient. L'exemple suivant indique la marche à suivre.

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

L'appel d'un service avec le SDK Java implique les étapes suivantes :

  1. Utilisez l'interface QueueClient pour créer un objet client de service de file d'attente. Si vous créez un service d'inférence, vous devez également créer des objets de file d'attente d'entrée et de sortie.

  2. Servez-vous de la fonction put() pour envoyer des données à la file d'attente d'entrée, et de la fonction watch() pour vous abonner aux données de la file d'attente de sortie.

    Remarque

    Dans un environnement de production, vous devriez utiliser des threads distincts pour l'envoi des données et l'abonnement aux données. À des fins de démonstration, cet exemple effectue ces opérations dans le même thread.

Compression des données de requête

Pour les requêtes contenant un grand volume de données, EAS prend en charge la compression des données au format Zlib ou Gzip avant leur envoi au serveur. Pour activer cette fonctionnalité, vous devez spécifier rpc.decompressor dans la configuration du service.

La configuration du service est la suivante :

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

Voici un exemple de code :

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

Dépannage

Pour résoudre les problèmes liés aux exceptions d'appel du Java SDK, y compris les problèmes courants d'authentification, de routage, de connexion et les erreurs côté serveur, consultez la section « Dépannage des exceptions d'appel » dans la rubrique SDK d'appel de service.

Pour obtenir la liste complète des codes d'état de service, la signification des messages d'erreur et les actions recommandées, consultez la rubrique Annexe : Codes d'état de service et erreurs courantes.