如何在FirebaseApp / NetHttpTransport上配置连接超时

时间:2018-10-13 18:35:45

标签: java firebase firebase-cloud-messaging

我正在与Google's FirebaseApp合作。我可以看到,如果没有网络连接,则库会继续尝试重新连接,并在60秒后抛出带有以下值的FirebaseMessagingException

  • 消息:“调用FCM后端服务时出错”
  • 错误代码:“内部错误”

60秒对我来说太长了,我想重新配置该值。 FirebaseOptions有一个setConnectTimeout()方法,但此方法无济于事。我设置的值没有考虑。

FirebaseOptions可以使用外部com.google.api.client.http.HttpTransport,但是我没有找到任何配置超时的选项。

FirebaseOptions:

FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .setDatabaseUrl(databaseUrl)
        .setConnectTimeout(20)
        .setReadTimeout(20);

NetHttpTransport,无法设置连接超时:

NetHttpTransport httpTransport = new NetHttpTransport.Builder()
    .setProxy(proxy)
    .setConnectionTimeout(..) <---- not exist
    .build();
builder.setHttpTransport(httpTransport);

有没有一种方法可以重新配置连接超时?

1 个答案:

答案 0 :(得分:0)

我发现了一种间接解决方法。该解决方案并不像我期望的那样完美,但这是解决该问题的唯一方法。

这是基本用例:

FirebaseApp firebaseApp = ...;
FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(firebaseApp);

Message message = Message.builder()....build();
String messageId = firebaseMessaging.send(message);

FirebaseMessaging有一个允许的方法:sendAsync()。此方法返回ApiFuture<String>而不是简单的String,它具有get(timeout, timeUnit):String方法。

我的最终代码如下:

try {
    FirebaseApp firebaseApp = ...;
    FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(firebaseApp);

    Message message = Message.builder()....build();

    ApiFuture<String> apiFuture = firebaseMessaging.sendAsync(message);

    // waiting for the response max. 5 secs
    String messageId = apiFuture.get(5000, TimeUnit.MILLISECONDS);

    // everything is fine here

} catch (Throwable t) {
    // java.util.concurent.TimeoutException appears
}