1

モバイルAndroidアプリでodata4jライブラリを使用しようとしています。リクエストを送信した直後にデバイスがモバイル接続を失ったために、HTTPリクエストが応答を受け取らない場合があります。それを再現してタイミングを調整しようと数回試みた後、ライブラリが「java.net.SocketException:接続がタイムアウトしました」をスローするのに約27分かかることに気付きました。このタイムアウトを減らして、障害をより迅速に処理できるようにする方法はありますか?ありがとう。

4

2 に答える 2

3

ジャージコンシューマー実装(デフォルト)を使用します。コンシューマーを構築するときに、JerseyClientBehavior[1]を追加します。これにより、ClientConfig[2]を変更できます。接続と読み取りのタイムアウトの両方を変更できます。

[1] http://code.google.com/p/odata4j/source/browse/odata4j-jersey/src/main/java/org/odata4j/jersey/consumer/behaviors/JerseyClientBehavior.java

[2] http://jersey.java.net/nonav/apidocs/1.1.5.1/jersey/com/sun/jersey/api/client/config/ClientConfig.html

于 2012-06-18T12:11:27.923 に答える
3

@JohnSpurlockの回答のコードスニペットを提供したいと思います。このコードの例えによりhttp://code.google.com/p/odata4j/source/browse/odata4j-jersey/src/main/java/org/odata4j/jersey/consumer/behaviors/AllowSelfSignedCertsBehavior.java

private static ODataJerseyConsumer createOdataConsumer(final String odataServerUrl) {

    Builder builder = ODataJerseyConsumer.newBuilder(odataServerUrl);
    builder.setClientBehaviors(TimeoutBehavior.reduceTimeout());
    return builder.build();
}

private enum TimeoutBehavior implements JerseyClientBehavior {
    INSTANCE;

    @Override
    public ODataClientRequest transform(final ODataClientRequest request) {

        return request;
    }

    @Override
    public void modify(final ClientConfig clientConfig) {

        Map<String, Object> properties = clientConfig.getProperties();
        properties.put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10 * 1000);
        properties.put(ClientConfig.PROPERTY_READ_TIMEOUT, 10 * 1000);
    }

    @Override
    public void modifyClientFilters(final Filterable filterable) {}

    @Override
    public void modifyWebResourceFilters(final Filterable filterable) {}

    public static OClientBehavior reduceTimeout() {

        return TimeoutBehavior.INSTANCE;
    }
}
于 2013-02-09T11:13:40.797 に答える