微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时

如何解决Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时

我一直在努力使后端Java应用程序运行。它在IntelliJ IDE中完全可以正常工作。但是,当我使用maven将其编译为Shadowjar时,admin SDK无法使用FirestoreClient运行监听功能。通过一些调试,我发现即使从.jar运行,该应用程序也可以吐出身份验证数据,并且可以检索用户的电子邮件-因此它肯定已通过身份验证并且可以正常工作。大约10分钟后,我收到与调用FirestoreClient.collection().addSnapshotListener

有关的超时错误

任何帮助将不胜感激。

     private FirebaseHandler(){

       FirebaSEOptions options;
       try {

       options = new FirebaSEOptions.Builder()
                   .setCredentials(GoogleCredentials.getApplicationDefault())
                   .setDatabaseUrl("https://crypto-rabbi-1599966847997.firebaseio.com")
                   .build();
           FirebaseApp.initializeApp(options);
           database = FirestoreClient.getFirestore();
           getAlertListener();
           getTradeListener();



           Message message = Message.builder()
                   .setToken("cP9xTCfUR7C8XeKabM6zIB:APA91bFXavA3xUFv7GTTmczu_ATUx21FVReNNr-o-Ze9lh-6xDdGjK2FeeG-ZwZU7Sm8_xtueisKenQ8ipNLW9RCnm4LKv4tdeusgF5KzLPRv2Fp7T59TAGba1RzsCAMWVxsnh2hmfWX")
                   .setAndroidConfig(
                           AndroidConfig.builder().setNotification(
                                   AndroidNotification.builder()
                                           .setTitle("HIO")
                                           .setBody("WTF")
                                           .setDefaultSound(true)
                                           .setPriority(AndroidNotification.Priority.HIGH)
                                           .setDefaultLightSettings(true)
                                           .setChannelId("PALERT")
                                           .build())
                                   .build())
                   .build();
           FirebaseMessaging.getInstance().sendAsync(message);
       } catch (FileNotFoundException e) {
           e.printstacktrace();
       } catch (IOException e) {
           e.printstacktrace();
       }





   }


    private void getTradeListener()  {


       database.collection("Trades")
               .addSnapshotListener((snapshots,e)->{

                   if (e != null) {
                       System.err.println("Listen Failed:" + e);
                       try {
                           getTradeListener();
                       } catch (Exception executionException) {
                           executionException.printstacktrace();
                       }
                       return;
                   }
                   //for each document one per user Trading
                   for (DocumentSnapshot doc :snapshots
                        ) {
                      String uID = doc.getId();     //null ptr exception here,document is null


                      Map<String,Object> TradeMap =  doc.getData();
                            //each Trade for the individual user
                       for (Map.Entry<String,Object> Trade: TradeMap.entrySet()
                            ) {
                           //get the individual Trade (one per symbol) and create the data from it
                           Map<String,Object> TradeEntry = (Map<String,Object>) Trade.getValue();
                           String key = TradeEntry.get("symbol") + "_" + uID;
                           AutoTradeData autoTradeData = new AutoTradeData(TradeEntry);

                           if(TradeEntry.get("status").equals("Canceling")){  // if the Trade is canceling get rid of it from the database
                               System.out.println("Canceling Trade: " + key);
                               if(TradeHandler.getInstance().autoTradesMap.containsKey(key)){
                                   System.out.println("Removed Trade from map: " + key);
                                   TradeHandler.getInstance().autoTradesMap.remove(key);
                               }
                               database.collection("Trades").document(uID).update(TradeEntry.get("symbol").toString(),FieldValue.delete());
                               break;
                           }
                           else if (!TradeHandler.getInstance().autoTradesMap.containsKey(key)) {  // else if the Trade that was updated is not in our activeTradelist
                               if (TradeEntry.get("status").toString().contains("Idle")) { // if the Trade is idle and we dont already have it,it must be new
                                   System.out.println("New Trade: " + autoTradeData.symbol);
                                   TradeHandler.getInstance().autoTradesMap.put(autoTradeData.symbol + "_" + uID,autoTradeData); // put this Trade in the book
                               }
                           }

                           if(!TradeHandler.getInstance().candleStickMap.containsKey(autoTradeData.symbol) && !TradeEntry.get("status").equals("Canceling")) { // if we dont already have data for the symbol we are Trading add it
                               BinanceHandler.getInstance().getCandlestickListener(autoTradeData.symbol);
                           }

                           if (!TradeHandler.getInstance().syncRequestClientMap.keySet().contains(uID) && !TradeEntry.get("status").equals("Canceling")) {
                               database.collection("users").document(uID).addSnapshotListener((snapshot,e2) -> {
                                   if (e2 != null) {
                                       System.err.println("Listen Failed:" + e2);
                                       return;
                                   }
                                   User user = snapshot.toObject(User.class);
                                   RequestOptions options = new RequestOptions();
                                   SyncRequestClient syncRequestClient = SyncRequestClient.create(user.apiKey,user.secretKey,options);

                                   TradeHandler.getInstance().syncRequestClientMap.put(uID,syncRequestClient);
                                   System.out.println("New SyncReq Client for " + uID + " " + syncRequestClient.getAccountinformation().getMaxWithdrawAmount().doubleValue());

                               });
                           }

                       }
                   }
       });
    }

    private void getAlertListener(){


    AlertHandler alertHandler =    AlertHandler.getInstance();
        database.collection("alerts")
                .addSnapshotListener((snapshots,e) -> {

                    if (e != null) {
                        System.err.println("Listen Failed:" + e);
                        getAlertListener();
                        return;
                    }


                    AlertHandler.getInstance().alertList = new ArrayList<>();
                    for (DocumentSnapshot doc : snapshots) {
                        String messagetoken = doc.getString("messagetoken");
                        ((List<Object>) doc.get("alertData")).forEach((response)->{
                            Map<String,Object> data = (Map<String,Object>) response;
                            PriceAlert.SerializedData priceData= new PriceAlert.SerializedData(data);
                            PriceAlert alert = new PriceAlert(priceData,messagetoken,doc.getId(),doc.getString("alertID"));
                            alertHandler.alertList.add(alert);
                        });

                    }

                    for (PriceAlert alert: AlertHandler.getInstance().alertList
                         ) {
                        System.out.println(alert.data.symbol +"_"+alert.data.price);
                    }
                });

    }


java.util.concurrent.ExecutionException: com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

at com.google.common.util.concurrent.AbstractFuture.getDoneValue([AbstractFuture.java:564](https://AbstractFuture.java:564))

at com.google.common.util.concurrent.AbstractFuture.get([AbstractFuture.java:545](https://AbstractFuture.java:545))

at com.google.api.core.AbstractApiFuture.get([AbstractApiFuture.java:56](https://AbstractApiFuture.java:56))

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.getTradeListener([FirebaseHandler.java:65](https://FirebaseHandler.java:65))

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<init>([FirebaseHandler.java:48](https://FirebaseHandler.java:48))

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<clinit>([FirebaseHandler.java:22](https://FirebaseHandler.java:22))

at com.awaiteddev.cryptorabbiadmin.Main.main([Main.java:20](https://Main.java:20))

Caused by: com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

at com.google.api.gax.rpc.ApiExceptionFactory.createException([ApiExceptionFactory.java:69](https://ApiExceptionFactory.java:69))

at com.google.api.gax.grpc.GrpcApiExceptionFactory.create([GrpcApiExceptionFactory.java:72](https://GrpcApiExceptionFactory.java:72))

at com.google.api.gax.grpc.GrpcApiExceptionFactory.create([GrpcApiExceptionFactory.java:60](https://GrpcApiExceptionFactory.java:60))

at com.google.api.gax.grpc.ExceptionResponSEObserver.onErrorImpl([ExceptionResponSEObserver.java:82](https://ExceptionResponSEObserver.java:82))

at com.google.api.gax.rpc.StateCheckingResponSEObserver.onError([StateCheckingResponSEObserver.java:86](https://StateCheckingResponSEObserver.java:86))

at com.google.api.gax.grpc.GrpcDirectStreamController$ResponSEObserverAdapter.onClose([GrpcDirectStreamController.java:149](https://GrpcDirectStreamController.java:149))

at io.grpc.internal.ClientCallImpl.cloSEObserver([ClientCallImpl.java:426](https://ClientCallImpl.java:426))

at io.grpc.internal.ClientCallImpl.access$500([ClientCallImpl.java:66](https://ClientCallImpl.java:66))

at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close([ClientCallImpl.java:689](https://ClientCallImpl.java:689))

at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$900([ClientCallImpl.java:577](https://ClientCallImpl.java:577))

at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal([ClientCallImpl.java:751](https://ClientCallImpl.java:751))

at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext([ClientCallImpl.java:740](https://ClientCallImpl.java:740))

at [io.grpc.internal.ContextRunnable.run](https://io.grpc.internal.ContextRunnable.run)([ContextRunnable.java:37](https://ContextRunnable.java:37))

at [io.grpc.internal.SerializingExecutor.run](https://io.grpc.internal.SerializingExecutor.run)([SerializingExecutor.java:123](https://SerializingExecutor.java:123))

at [java.util.concurrent.Executors$RunnableAdapter.call](https://java.util.concurrent.Executors$RunnableAdapter.call)(UnkNown Source)

at [java.util.concurrent.FutureTask.run](https://java.util.concurrent.FutureTask.run)(UnkNown Source)

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(UnkNown Source)

at [java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run](https://java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run)(UnkNown Source)

at java.util.concurrent.ThreadPoolExecutor.runWorker(UnkNown Source)

at [java.util.concurrent.ThreadPoolExecutor$Worker.run](https://java.util.concurrent.ThreadPoolExecutor$Worker.run)(UnkNown Source)

at [java.lang.Thread.run](https://java.lang.Thread.run)(UnkNown Source)

Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

at io.grpc.Status.asRuntimeException([Status.java:533](https://Status.java:533))

... 16 more

Caused by: io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection timed out: no further information: [firestore.googleapis.com/2607:f8b0:400a:804:0:0:0:200a:443](https://firestore.googleapis.com/2607:f8b0:400a:804:0:0:0:200a:443)

Caused by: java.net.ConnectException: Connection timed out: no further information

at sun.nio.ch.socketChannelImpl.checkConnect(Native Method)

at sun.nio.ch.socketChannelImpl.finishConnect(UnkNown Source)

at io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect([NioSocketChannel.java:330](https://NioSocketChannel.java:330))

at io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioChannel$AbstractNIoUnsafe.finishConnect([AbstractNioChannel.java:334](https://AbstractNioChannel.java:334))

at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey([NioEventLoop.java:702](https://NioEventLoop.java:702))

at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized([NioEventLoop.java:650](https://NioEventLoop.java:650))

at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys([NioEventLoop.java:576](https://NioEventLoop.java:576))

at [io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run](https://io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run)([NioEventLoop.java:493](https://NioEventLoop.java:493))

at [io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run](https://io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run)([SingleThreadEventExecutor.java:989](https://SingleThreadEventExecutor.java:989))

at [io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run](https://io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run)([ThreadExecutorMap.java:74](https://ThreadExecutorMap.java:74))

at [io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run](https://io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run)([FastThreadLocalRunnable.java:30](https://FastThreadLocalRunnable.java:30))

at [java.lang.Thread.run](https://java.lang.Thread.run)(UnkNown Source)

java.lang.NullPointerException

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.getTradeListener([FirebaseHandler.java:71](https://FirebaseHandler.java:71))

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<init>([FirebaseHandler.java:48](https://FirebaseHandler.java:48))

at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<clinit>([FirebaseHandler.java:22](https://FirebaseHandler.java:22))

at com.awaiteddev.cryptorabbiadmin.Main.main([Main.java:20](https://Main.java:20))t this error:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?