如何解决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 举报,一经查实,本站将立刻删除。