1

を使用してデータをローカルに永続化しようとしていGluonClientます。いくつかの要素で散発的に機能していますが、ほとんどの要素でエラーがスローされます。

私は次のように初期化します:

GluonClient localClient = GluonClientBuilder.create()
    .operationMode(OperationMode.LOCAL_ONLY)
    .build();

RestClientREST API からデータを取得するためにを使用しています。リストが初期化されたら、データをローカルに保存しようとします (この読み取りに GluonClient を使用しようとしましたが、成功しませんでした):

RestClient apiClient = RestClient.create().method("GET")
    .host("http://localhost:8080/api")
    .path("/path/to/data")
    .queryParam("token","mytoken");
JobsIterableInputConverter<Job> converter = new JobsIterableInputConverter<>(Job.class);
GluonObservableList<Job.class> jobs = (DataProvider.retrieveList(apiClient.createListDataReader(converter)));
jobs.initializedProperty((obv,ov,nv)->{
    saveJobList(jobs);
});


private void saveJobListLocally(GluonObservableList<Job> list){
    GluonObservableList<Job> eqs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));
    eqs.initializedProperty().addListener((obv, ov, nv) -> {
        if (nv && eqs.isEmpty()) {
            eqs.addAll(list);
        }
    });
}

これは、一部のデータに対して時々機能します。約 4 (常に 4 とは限りません)の 168 個の Job オブジェクトが保存され、残りは例外を生成します。

javax.json.stream.JsonParsingException: Invalid token=EOF at (line no=1, column no=0, offset=-1). Expected tokens are: [CURLYOPEN, SQUAREOPEN]

ローカル データを取得するには、次のように呼び出します。

jobs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));

これはうまくいきます。

-保存された ~4 個のオブジェクトにアクセスして使用できますが、残りは失われます。

-保存される ~4 個のオブジェクトは、テストごとに同じではありません (最も紛らわしい部分)。

- 各ジョブ オブジェクトのデータを同一にして、データが無効かどうか、または無効な文字があるかどうかをテストしましたが、同じ問題が発生しました。を使用して、以前に他のアプリケーションでデータを解析して使用したことがありますorg.json

-場合によっては、「失われた」オブジェクトごとに、ジョブ ファイルに加えて、ファイル名として UID を持つファイルが生成されます

-例外がスローされていないことを 2 回確認しましたが、ほとんどのデータがまだ欠落していました。

-Job Class はIntegerPropertyStringPropertyデータ型に と を使用します。注釈付きのゲッター@XMLElement

から見ている動作にGluonClientは一貫性がありません。

使用しようとしましFileClientたが、リストでは機能しません (このトラックに参加する必要がありますか?)。

GluonClientを使用して、ローカル コンテンツをリストとして保存および処理するにはどうすればよいですか?

使用するjavafxportsVersion= '8.60.7'

public class JobsIterableInputConverter<E> extends InputStreamIterableInputConverter<E> implements Iterator<E> {

    private JsonArray jsonArray = null;
    private int index;
    private final JsonConverter<E> converter;

    public JobsIterableInputConverter(Class<E> targetClass)
    {
        converter = new JsonConverter<>(targetClass);
    }

    @Override
    public boolean hasNext()
    {
        if (jsonArray == null) {
            return false;
        }
        return index < jsonArray.size();
    }

    @Override
    public E next()
    {
        JsonObject jsonObject = jsonArray.getJsonObject(index++);
        return converter.readFromJson(jsonObject);
    }

    @Override
    public Iterator<E> iterator()
    {
        index = 0;

        try (JsonReader reader = Json.createReader(getInputStream())) {
            JsonObject jsonObject = reader.readObject();
            jsonArray = jsonObject.getJsonArray("jobs");
        }

        return this;
    }
}

API の戻り形式:

{"jobs":[
    {"id":0},
    {"id":1}
]}
4

1 に答える 1

0

リストからローカル ストレージに多くのアイテムを保存するときに、実際にバグが発生しました。JSON が破損する理由は、オブジェクトが保存されているローカル ファイルに同時にアクセスできる可能性があるためです。このバグは、次のプル リクエストで既に修正されています: https://bitbucket.org/gluon-oss/gluon-connect/pull-requests/1/make-sure-there-is-no-simultaneous-access/diff

今週中に新しいリリースが予定されています。

于 2016-08-10T07:33:01.157 に答える