All Products
Search
Document Center

Platform For AI:Java SDK

Last Updated:Aug 29, 2026

Panduan ini menjelaskan cara menggunakan Java SDK untuk memanggil layanan model Elastic Algorithm Service (EAS), serta menyediakan contoh input/output dan program sampel.

Catatan

Untuk kasus penggunaan dan prinsip SDK, lihat SDK pemanggilan layanan.

Prasyarat

Untuk menggunakan Java SDK EAS dalam proyek Maven Anda, tambahkan dependensi eas-sdk ke bagian <dependencies> pada file pom.xml Anda. Untuk versi terbaru, periksa Repositori Maven.

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

SDK EAS versi 2.0.5 dan yang lebih baru mencakup fungsionalitas client QueueService untuk layanan antrian asinkron multi-prioritas. Untuk menggunakan fitur ini dan menghindari konflik dependensi, tambahkan dua dependensi berikut dan sesuaikan versinya jika diperlukan:

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

Mulai cepat

Untuk melakukan pemanggilan layanan dengan Java SDK, ikuti tiga langkah berikut:

  1. Dapatkan informasi pemanggilan: Di halaman detail layanan di Konsol EAS, buka tab Call Information untuk mendapatkan titik akhir, nama layanan, dan token.

  2. Pilih jenis permintaan dan tulis kode: Pilih kelas Request/Response yang sesuai berdasarkan format data masukan model Anda, lalu tulis kode Anda menggunakan contoh minimal di bawah ini.

    Catatan

    Jika Anda menerapkan layanan dengan Built-in Processor, SDK menyediakan kelas input dan output yang sesuai. Sebagai contoh, TensorFlow Processor bawaan berkorespondensi dengan TFRequest. Untuk informasi lebih lanjut, lihat dokumentasi setiap prosesor di bawah Built-in Processors.

  3. Jalankan dan verifikasi: Jalankan program client dan verifikasi tanggapan. Jika terjadi kesalahan, rujuk panduan Pemecahan Masalah.

Kode berikut merupakan contoh end-to-end minimal untuk permintaan berbasis string. Untuk contoh lainnya, lihat Contoh Program:

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());
        
        // Untuk menggunakan koneksi langsung VPC, panggil metode setDirectEndpoint. Formatnya biasanya {uid}.vpc.{region-id}.pai-eas.aliyuncs.com.
        client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // Titik akhir publik untuk layanan EAS. Formatnya biasanya {uid}.{region-id}.pai-eas.aliyuncs.com.
        // client.setEndpoint("182848887922****.cn-shanghai.pai-eas.aliyuncs.com");
        
        // Nama layanan EAS.
        client.setModelName("your_service_name");
        client.setToken("YOUR_SERVICE_TOKEN");
        // Jalur permintaan. URL permintaan lengkapnya adalah http://<endpoint>/api/direct/<modelName>/<requestPath>.
        client.setRequestPath("your_custom_path");
        // Bangun badan permintaan. Kelas input yang didukung bergantung pada SDK. Contoh ini menggunakan String.
        String request = "[{}]";
        String response = client.predict(request);
        System.out.println(response);

        client.shutdown();
    }
}

Referensi API

Java SDK menyediakan kelas-kelas berikut:

Grup

Deskripsi kelas

Main Client Class

PredictClient: Kelas utama untuk mengonfigurasi detail layanan seperti titik akhir dan token, mengirim permintaan, dan menerima tanggapan.

Konfigurasi koneksi

HttpConfig: Mengonfigurasi parameter koneksi HTTP, seperti timeout dan jumlah maksimum koneksi.

Input/output

  • TFRequest: Membungkus permintaan untuk model TensorFlow.

  • TFResponse: Mengurai tanggapan dari model TensorFlow.

  • Untuk skenario berbasis string, tidak diperlukan kelas permintaan atau tanggapan khusus. Anda dapat langsung mengirim dan menerima data sebagai objek String.

  • Untuk detail jenis lain yang didukung, rujuk SDK.

Layanan antrian

  • QueueClient: Client antrian asinkron untuk mengirim dan berlangganan data. Kelas ini memerlukan dependensi tambahan, sebagaimana dijelaskan di bagian Prasyarat.

  • DataFrame: Objek yang membungkus item data dari layanan antrian.

Kelas PredictClient

Kelas client utama. Kelas ini mengonfigurasi informasi layanan, mengirim permintaan, dan menerima hasil prediksi.

API

Deskripsi

PredictClient(HttpConfig httpConfig)

  • Membuat instance PredictClient.

  • Parameter: httpConfig adalah instance dari kelas HttpConfig.

void setToken(String token)

  • Menetapkan token otentikasi untuk permintaan HTTP.

  • Parameter: token adalah token otentikasi untuk akses layanan.

void setModelName(String modelName)

  • Menetapkan nama model untuk layanan prediksi online.

  • Parameter: modelName adalah nama model yang akan digunakan.

void setEndpoint(String endpoint)

  • Fungsi: Menentukan host dan port layanan yang diminta. Formatnya adalah "host:port".

  • Parameter: endpoint adalah alamat titik akhir layanan dalam format "host:port".

void setDirectEndpoint(String endpoint)

  • Menetapkan titik akhir untuk mengakses layanan melalui koneksi langsung VPC.

  • Parameter: endpoint adalah alamat titik akhir layanan.

void setRequestPath(String requestPath)

  • Menetapkan jalur permintaan sebagaimana didefinisikan dalam kode sisi server.

  • Parameter: requestPath adalah jalur permintaan sisi server. Contoh: client.setRequestPath("/custom_path").

void setRetryCount(int retryCount)

  • Menetapkan jumlah percobaan ulang untuk permintaan yang gagal.

  • Parameter: retryCount adalah jumlah percobaan ulang.

void setRetryConditions(EnumSet retryConditions)

  • Menetapkan kondisi untuk mencoba ulang permintaan. Anda dapat menggunakan metode ini bersama metode setRetryCount. Secara default, semua kesalahan permintaan akan dicoba ulang. Metode ini memungkinkan Anda menentukan hanya kesalahan permintaan tertentu yang akan dicoba ulang.

  • Parameter: retryConditions adalah EnumSet yang berisi satu atau beberapa kondisi percobaan ulang. Kondisi yang didukung meliputi:

    • RetryCondition.CONNECTION_FAILED: Koneksi permintaan gagal.

    • RetryCondition.CONNECTION_TIMEOUT: Koneksi permintaan melebihi waktu tunggu.

    • RetryCondition.READ_TIMEOUT: Permintaan melebihi waktu tunggu saat menunggu tanggapan.

    • RetryCondition.RESPONSE_5XX: Server mengembalikan kode status 5xx.

    • RetryCondition.RESPONSE_4XX: Server mengembalikan kode status 4xx.

  • Contoh:

    client.setRetryConditions(
        EnumSet.of(
            RetryCondition.READ_TIMEOUT,    // Coba ulang saat read timeout
            RetryCondition.RESPONSE_5XX     // Coba ulang saat terjadi kode kesalahan 5xx
        )
    );

    Contoh ini menentukan bahwa permintaan hanya akan dicoba ulang jika melebihi waktu tunggu atau jika server mengembalikan kode status 5xx.

void setContentType(String contentType)

  • Menetapkan Content-Type untuk permintaan HTTP. Nilai default-nya adalah "application/octet-stream".

  • Parameter: contentType adalah tipe konten dari aliran data yang dikirim.

void setUrl(String url)

Menetapkan URL permintaan kustom.

void setCompressor(Compressor compressor)

  • Menetapkan metode kompresi untuk data permintaan.

  • Parameter: compressor adalah metode kompresi. Nilai yang didukung adalah Compressor.Gzip dan Compressor.Zlib.

  • Untuk informasi lebih lanjut, lihat Contoh Kompresi Data Permintaan.

void addExtraHeaders(Map<String, String> extraHeaders)

  • Menambahkan header HTTP kustom ke permintaan.

  • Parameter: extraHeaders adalah Map<String, String> header HTTP yang akan ditambahkan.

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

  • Membuat client anak yang berbagi kolam thread dengan client induk. Ini berguna untuk prediksi multi-threaded.

  • Parameter:

    • token: Token otentikasi untuk layanan.

    • endpoint: Titik akhir layanan.

    • modelName: Nama model.

void predict(TFRequest runRequest)

  • Mengirim permintaan TensorFlow ke layanan prediksi online.

  • Parameter: runRequest adalah instance objek TFRequest.

void predict(String requestContent)

  • Mengirim permintaan berbasis string ke layanan prediksi online.

  • Parameter: requestContent adalah konten permintaan dalam bentuk string.

void predict(byte[] requestContent)

  • Mengirim permintaan berupa array byte ke layanan prediksi online.

  • Parameter: requestContent adalah konten permintaan dalam bentuk array byte.

Kelas HttpConfig

Mengonfigurasi parameter koneksi HTTP dasar, seperti timeout, jumlah thread, dan kolam koneksi.

API

Deskripsi

void setIoThreadNum(int ioThreadNum)

  • Menetapkan jumlah thread I/O untuk permintaan HTTP. Nilai default-nya adalah 2.

  • Parameter: ioThreadNum adalah jumlah thread I/O.

void setReadTimeout(int readTimeout)

  • Waktu maksimum untuk menunggu paket data dari server setelah koneksi terbentuk. Nilai default-nya adalah 5000 (5 detik).

  • Parameter: readTimeout adalah timeout baca dalam milidetik.

Penting

Timeout ini hanya berlaku setelah koneksi terbentuk. Berbeda dengan timeout permintaan yang ditetapkan oleh metode setRequestTimeout.

void setRequestTimeout(int requestTimeout)

  • Waktu total yang diizinkan untuk satu permintaan, mulai dari pengiriman hingga menerima tanggapan lengkap. Nilai default-nya adalah 5000 (5 detik).

  • Parameter: requestTimeout adalah timeout permintaan dalam milidetik.

Penting

Timeout ini mencakup seluruh siklus hidup permintaan, termasuk pembentukan koneksi, transfer data, dan pemrosesan server. Berbeda dengan timeout baca yang ditetapkan oleh metode setReadTimeout.

void setConnectTimeout(int connectTimeout)

  • Waktu maksimum untuk menunggu saat membentuk koneksi. Nilai default-nya adalah 5000 (5 detik).

  • Parameter: connectTimeout adalah timeout koneksi dalam milidetik.

void setMaxConnectionCount(int maxConnectionCount)

  • Menetapkan jumlah maksimum total koneksi dalam kolam koneksi. Nilai default-nya adalah 1000.

  • Parameter: maxConnectionCount adalah jumlah maksimum koneksi.

void setMaxConnectionPerRoute(int maxConnectionPerRoute)

  • Menetapkan jumlah maksimum koneksi per rute. Nilai default-nya adalah 1000.

  • Parameter: maxConnectionPerRoute adalah jumlah maksimum koneksi untuk setiap rute.

void setKeepAlive(boolean keepAlive)

  • Fungsi: Mengonfigurasi keep-alive untuk layanan HTTP.

  • Parameter: keepAlive. Menentukan apakah mekanisme keep-alive untuk koneksi diaktifkan. Nilai default-nya adalah true.

int getErrorCode()

Mengembalikan kode status dari pemanggilan API terakhir.

String getErrorMessage()

Mengembalikan pesan status dari pemanggilan API terakhir.

Kelas TFRequest

Membangun data masukan untuk model TensorFlow.

API

Deskripsi

void setSignatureName(String value)

  • Fungsi: Menentukan nama signatureDef untuk model yang diminta ketika model dalam format TensorFlow SavedModel.

  • Parameter: Nama signatureDef untuk model permintaan.

void addFetch(String value)

  • Menentukan tensor output yang akan diambil dari model.

  • Parameter: value adalah alias tensor output yang akan diambil.

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

  • Menambahkan tensor input ke permintaan.

  • Parameter:

    • inputName: Alias tensor input.

    • dataType: Tipe data tensor input.

    • shape: Bentuk tensor input.

    • content: Konten tensor, disediakan sebagai array satu dimensi yang diratakan. Tipe elemen dalam array bergantung pada dataType:

      Jika DataType tensor input adalah DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16, atau DT_HALF, tipe elemen dalam content adalah FLOAT. Ketika DataType-nya DT_COMPLEX64, dua elemen FLOAT berdekatan dalam content masing-masing merepresentasikan bagian real dan imajiner dari bilangan kompleks.

      Jika DataType tensor input adalah DT_DOUBLE atau DT_COMPLEX128, elemen dalam content bertipe DOUBLE. Ketika DataType-nya DT_COMPLEX128, dua elemen DOUBLE berdekatan dalam content masing-masing merepresentasikan bagian real dan imajiner dari bilangan kompleks.

      Jika DataType tensor input adalah DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16, atau DT_UINT16, tipe elemen dalam content adalah INT.

      Jika DataType tensor input adalah DT_INT64, tipe elemen dalam content adalah LONG.

      Jika DataType tensor input adalah DT_STRING, tipe elemen dalam content adalah STRING.

      Jika DataType tensor input adalah DT_BOOL, tipe elemen dalam content adalah BOOLEAN.

Kelas TFResponse

Mengurai dan mengakses data keluaran dari prediksi model TensorFlow.

API

Deskripsi

List<Long> getTensorShape(String outputName)

  • Mendapatkan bentuk tensor output tertentu.

  • Parameter: outputName adalah alias tensor output.

  • Mengembalikan: Daftar long yang merepresentasikan bentuk tensor.

List<Float> getFloatVals(String outputName)

  • Fungsi: Jika DataType tensor output adalah DT_FLOAT, DT_COMPLEX64, DT_BFLOAT16, atau DT_HALF, Anda dapat memanggil antarmuka ini untuk mengambil data tensor output yang ditentukan.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Array satu dimensi yang diratakan dari output TensorData model.

List<Double> getDoubleVals(String outputName)

  • Fungsi: Mendapatkan data tensor output yang ditentukan jika DataType tensor output adalah DT_DOUBLE atau DT_COMPLEX128.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Array satu dimensi yang merupakan hasil perataan output TensorData dari model.

List<Integer> getIntVals(String outputName)

  • Fungsi: Mendapatkan data tensor output yang ditentukan jika DataType-nya DT_INT32, DT_UINT8, DT_INT16, DT_INT8, DT_QINT8, DT_QUINT8, DT_QINT32, DT_QINT16, DT_QUINT16, atau DT_UINT16.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Output TensorData dari model, diratakan menjadi array satu dimensi.

List<String> getStringVals(String outputName)

  • Fungsi: Jika DataType tensor output adalah DT_STRING, Anda dapat memanggil antarmuka ini untuk mendapatkan data tensor tersebut.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Array satu dimensi yang dibuat dengan meratakan output TensorData dari model.

List<Long> getInt64Vals(String outputName)

  • Fungsi: Jika DataType tensor output adalah DT_INT64, Anda dapat memanggil antarmuka ini untuk mendapatkan data tensor output yang ditentukan.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Array satu dimensi yang diperoleh dengan meratakan output TensorData dari model.

List<Boolean> getBoolVals(String outputName)

  • Fungsi: Mengambil data tensor output yang ditentukan jika DataType-nya DT_BOOL.

  • Parameter: outputName adalah alias tensor output.

  • Nilai kembalian: Array satu dimensi yang dihasilkan dari perataan output TensorData dari model.

Kelas QueueClient

Berinteraksi dengan layanan antrian EAS untuk memproduksi, mengonsumsi, dan mengelola data.

API

Deskripsi

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

  • Membuat instance QueueClient.

  • Parameter:

    • endpoint: Alamat titik akhir layanan antrian.

    • queueName: Nama layanan antrian.

    • token: Token untuk akses layanan.

    • httpConfig: Konfigurasi permintaan HTTP.

    • user: Konfigurasi pengguna. Menentukan UserId (UUID acak secara default) dan GroupName (eas secara default).

JSONObject attributes()

  • Mendapatkan atribut detail layanan antrian.

  • Mengembalikan: JSONObject dengan informasi antrian, termasuk bidang-bidang berikut:

    • meta.maxPayloadBytes: Ukuran maksimum yang diizinkan (dalam byte) untuk satu item data.

    • meta.name: Nama antrian.

    • stream.approxMaxLength: Perkiraan jumlah maksimum item yang dapat disimpan antrian.

    • stream.firstEntry: Indeks item pertama dalam antrian.

    • stream.lastEntry: Indeks item terakhir dalam antrian.

    • stream.length: Jumlah item saat ini dalam antrian.

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

  • Menulis item data ke antrian.

  • Parameter:

    • data: Data yang akan ditulis, dalam bentuk array byte.

    • priority: Prioritas data. 1 untuk prioritas tinggi, 0 untuk prioritas normal (default).

    • tags: Peta tag kunci-nilai kustom.

  • Mengembalikan: Pair<Long, String> yang berisi index item data baru dan request ID.

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

  • Mengambil item data dari antrian.

  • Parameter:

    • index: Indeks awal untuk mengambil data. Gunakan -1 untuk membaca data terbaru.

    • length: Jumlah item data yang akan diambil.

    • timeout: Periode timeout dalam detik.

    • autoDelete: Jika true, data secara otomatis dihapus dari antrian setelah diambil.

    • tags: Peta tag kunci-nilai kustom, seperti RequestID.

  • Mengembalikan: Array objek DataFrame.

void truncate(Long index)

  • Menghapus semua item data dalam antrian dengan indeks kurang dari index yang ditentukan.

String delete(Long index)

  • Menghapus item data tertentu dari antrian.

  • Parameter: index adalah indeks item data yang akan dihapus.

  • Mengembalikan: "OK" jika penghapusan berhasil.

JSONObject search(long index)

  • Memeriksa status item data tertentu dalam antrian.

  • Parameter: index adalah indeks item data yang akan diperiksa.

  • Mengembalikan: JSONObject dengan informasi antrian, termasuk:

    • ConsumerId: ID instans yang memproses item tersebut.

    • IsPending: true jika item sedang diproses; false jika item sedang menunggu dalam antrian.

      • True berarti sedang diproses.

      • False berarti sedang dalam antrian.

    • WaitCount: Jumlah item di depan dalam antrian. Ini hanya valid jika IsPending adalah false. Jika IsPending adalah true, nilai ini adalah 0.

    Contoh Tanggapan:

    • Layanan mengembalikan {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2}, yang menunjukkan bahwa permintaan sedang dalam antrian.

    • Log menampilkan no data in stream dan mengembalikan {}. Ini menunjukkan bahwa data tidak ditemukan dalam antrian. Hal ini mungkin karena data telah berhasil diproses oleh sisi server dan hasil telah dikembalikan, atau parameter index dikonfigurasi salah. Harap periksa dan konfirmasi.

Penting

Saat memanggil search, Anda harus menetapkan ID grup dalam objek QueueUser ke nama layanan. Jika tidak, IsPending dalam hasil pencarian selalu false.

  • Tetapkan ID grup ke nama layanan:

    QueueUser u = new QueueUser(UUID.randomUUID().toString(), "<service_name>");
    QueueClient input_queue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), u);
  • Periksa status untuk indeks yang ditentukan:

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

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

  • Berlangganan layanan antrian untuk menerima item data saat tersedia.

  • Parameter:

    • index: Indeks awal. Gunakan -1 untuk mengabaikan semua data tertunda dan mulai dengan item terbaru.

    • window: Ukuran jendela pengiriman (jumlah maksimum item yang belum dikomit). Layanan akan berhenti mengirim jika jumlah item yang belum dikomit mencapai ukuran jendela ini.

    • indexOnly: Jika true, objek DataFrame yang dikembalikan hanya berisi indeks dan tag, bukan muatan data, untuk menghemat bandwidth.

    • autoCommit: Jika true, item secara otomatis dikomit saat diterima, sehingga pemanggilan commit() tidak diperlukan. Saat autoCommit diatur ke true, parameter window diabaikan.

    • tags: Peta parameter kustom untuk permintaan langganan.

  • Mengembalikan: Objek WebSocketWatcher untuk menerima data yang dilanggan. Lihat contoh layanan antrian untuk detail penggunaan.

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

  • Mengonfirmasi bahwa satu atau beberapa item data telah dikonsumsi, yang akan menghapusnya dari antrian.

  • Mengembalikan: "OK" jika komit berhasil.

void end(boolean force)

Menutup koneksi ke layanan antrian.

Kelas DataFrame

Pembungkus untuk item data dari layanan antrian.

API

Deskripsi

byte[] getData()

  • Mendapatkan muatan data.

  • Mengembalikan: Data dalam bentuk array byte.

long getIndex()

  • Mendapatkan indeks item data.

  • Mengembalikan: Indeks data sebagai long.

Map<String, String> getTags()

  • Mendapatkan tag yang terkait dengan item data.

  • Nilai kembalian: Objek Map<String,String> bernama Tags, yang dapat digunakan untuk mendapatkan RequestID. Contohnya, df.getTags().get("requestId").

Contoh kode

Contoh inferensi sinkron

Pilih contoh yang sesuai dengan format input dan output layanan Anda.

String

Jika Anda menerapkan layanan dengan prosesor kustom, Anda biasanya menggunakan string untuk memanggilnya. Praktik ini umum untuk layanan model PMML, sebagaimana ditunjukkan pada contoh berikut.

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 {
        // Inisialisasi client. Objek client harus dibagikan. Jangan membuat objek client baru untuk setiap permintaan.
        PredictClient client = new PredictClient(new HttpConfig());
        client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
        // Untuk menggunakan koneksi jaringan langsung, panggil metode setDirectEndpoint.
        // Contoh: client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // Untuk mengaktifkan koneksi jaringan langsung, Anda harus mengaktifkannya di Konsol EAS dan menyediakan vSwitch sumber yang digunakan untuk mengakses layanan EAS. Ini melewati gerbang, memungkinkan Anda mengakses instans layanan secara langsung melalui load balancing perangkat lunak untuk meningkatkan stabilitas dan kinerja.
        // Catatan: Untuk akses gerbang standar, gunakan titik akhir yang dimulai dengan ID pengguna Anda. Anda dapat menemukan titik akhir ini di "Call Information" layanan di Konsol EAS. Untuk koneksi jaringan langsung, gunakan nama domain dalam format 182848887922****.vpc.{region_id}.aliyuncs.com.
        client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
        client.setModelName("scorecard_pmml_example");

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

        // Dapatkan string tanggapan dari EAS.
        try {
            String response = client.predict(request);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Matikan client.
        client.shutdown();
        return;
    }
}

TensorFlow

Jika Anda menggunakan model TensorFlow, gunakan kelas TFRequest dan TFResponse untuk input dan output, sebagaimana ditunjukkan pada contoh berikut.

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

        // Untuk menggunakan koneksi jaringan langsung, panggil metode setDirectEndpoint. Format titik akhirnya adalah {uid}.vpc.{region_id}.aliyuncs.com.
        // client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
        // Untuk akses gerbang standar, gunakan titik akhir yang dimulai dengan ID pengguna Anda. Anda dapat menemukan titik akhir ini di "Call Information" layanan di Konsol EAS.
        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();
    }
}

Contoh layanan antrian

Untuk mengakses layanan antrian, gunakan antarmuka QueueClient. Contoh berikut menunjukkan caranya.

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 {
        /** Buat client layanan antrian. */
        String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
        String inputQueueName = "test_queue_service";
        String sinkQueueName = "test_queue_service/sink";
        String queueToken = "test-token";

        /** Antrian input. Layanan inferensi secara otomatis membaca data permintaan dari antrian ini. */
        QueueClient inputQueue =
            new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** Antrian output. Setelah layanan inferensi memproses data input, hasilnya ditulis ke antrian ini. */
        QueueClient sinkQueue =
            new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** Hapus data antrian. Gunakan dengan hati-hati. */
        inputQueue.clear();
        sinkQueue.clear();

        /** Tambahkan data ke antrian input. */
        int count = 10;
        for (int i = 0; i < count; ++i) {
            String data = Integer.toString(i);
            inputQueue.put(data.getBytes(), null);
            /** Layanan antrian mendukung beberapa prioritas. Anda dapat menggunakan metode put untuk menetapkan prioritas data. Prioritas default-nya adalah 0. */
            //  inputQueue.put(data.getBytes(), 0L, null);
        }

        /** Gunakan metode watch untuk berlangganan data dari antrian output. Ukuran jendelanya adalah 5. */
        WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null);
        /** Gunakan parameter WatchConfig untuk menyesuaikan jumlah percobaan ulang, interval percobaan ulang (dalam detik), dan apakah akan mencoba ulang tanpa batas. Jika Anda tidak mengonfigurasi WatchConfig, sistem default-nya adalah 3 kali percobaan ulang dengan interval 5 detik. */
        //  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));

        /** Dapatkan data output. */
        for (int i = 0; i < count; ++i) {
            try {
                /** Metode getDataFrame() mengambil data DataFrame. Pemanggilan ini memblokir hingga data tersedia. */
                byte[] data = watcher.getDataFrame().getData();
                System.out.println("[watch] data = " + new String(data));
            } catch (RuntimeException ex) {
                System.out.println("[watch] error = " + ex.getMessage());
                break;
            }
        }
        /** Tutup objek watcher. Setiap instance client hanya mendukung satu objek watcher. Jika Anda tidak menutup watcher, akan terjadi kesalahan pada eksekusi berikutnya. */
        watcher.close();

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

        /** Matikan client. */
        inputQueue.shutdown();
        sinkQueue.shutdown();
    }
}

Memanggil layanan dengan Java SDK melibatkan langkah-langkah berikut:

  1. Gunakan antarmuka QueueClient untuk membuat objek client layanan antrian. Jika Anda membuat layanan inferensi, Anda juga harus membuat objek antrian input dan antrian output.

  2. Gunakan fungsi put() untuk mengirim data ke antrian input, dan gunakan fungsi watch() untuk berlangganan data dari antrian output.

    Catatan

    Di lingkungan produksi, Anda harus menggunakan thread terpisah untuk mengirim data dan berlangganan data. Untuk tujuan demonstrasi, contoh ini melakukan operasi tersebut dalam satu thread.

Kompresi data permintaan

Untuk permintaan yang berisi banyak data, EAS mendukung kompresi data menggunakan format Zlib atau Gzip sebelum mengirimkannya ke sisi server. Untuk mengaktifkan fitur ini, Anda harus menentukan rpc.decompressor dalam konfigurasi layanan.

Konfigurasi layanan adalah sebagai berikut:

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

Berikut adalah contoh kodenya:

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{
    	  // Inisialisasi client.
        PredictClient client = new PredictClient(new HttpConfig());
        client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("echo_compress");
        client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
        // Anda juga dapat menggunakan Compressor.Gzip.
        client.setCompressor(Compressor.Zlib);
        // Definisikan string input.
        String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
        System.out.println(request);
        // Dapatkan string tanggapan dari EAS.
        String response = client.predict(request);
        System.out.println(response);
        // Matikan client.
        client.shutdown();
        return;
    }
}

Pemecahan Masalah

Untuk memecahkan masalah Java SDK exception pemanggilan, termasuk isu umum terkait otentikasi, routing, koneksi, dan kesalahan sisi server, lihat bagian "Pemecahan Masalah Exception Pemanggilan" dalam SDK Pemanggilan Layanan.

Untuk daftar lengkap kodes status layanan, makna pesan kesalahan, dan tindakan yang direkomendasikan, lihat Lampiran: Kode Status Layanan dan Kesalahan Umum.