JavaアプリケーションからBigQueryに対してInsertしているとたまにsocket timeoutでエラーになってしまうことがあったので対応内容の備忘録。
やったこと
GoogleCredential.BuilderのRequestInitializerでreadTimeoutを設定。
サンプルコード
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
GoogleCredential.Builder credBuilder = new GoogleCredential.Builder();
credBuilder.setJsonFactory(jsonFactory);
credBuilder.setTransport(httpTransport);
credBuilder.setServiceAccountId(ACCOUNT_ID);
credBuilder.setServiceAccountPrivateKeyFromP12File(KEY_FILE);
credBuilder.setServiceAccountScopes(Collections.singleton(BigqueryScopes.BIGQUERY));
final HttpRequestInitializer initializer = credBuilder.getRequestInitializer();
credBuilder.setRequestInitializer(new HttpRequestInitializer() {
public void initialize(HttpRequest request) throws IOException {
initializer.initialize(request);
request.setReadTimeout(0); // milliseconds (0: infinity)
}
});
GoogleCredential credential = credBuilder.build();
:
:
これとかみると NetHttpTransportでreadTimeoutを設定すれば良い気もしたけど、HttpTransportをNetHttpTransportに変えてもビルドエラーになってしまったのでとりあえずこれで回避。