firebase - 编译的 Jar 不断抛出: SynchronizationContext 中未捕获的异常
问题描述
我一直在尝试制作一个小型应用程序,它首先扫描 HTML 中的数据,然后将其上传到我的 Firestore。我现在基本上已经完成了它,当从 IntelliJ IDEA 中启动它时,它工作得很好。但是,一旦我将其导出到工件中,它就会在尝试从 Firestore 下载/上传到 Firestore 时开始引发以下异常!
我应该提到我在 Koltin/JVM 中编码,因为它更容易。由于没有 Kotlin Firebase-Admin 版本,我只使用 Java 版本,这应该不是问题,因为 Kotlin 编译为 Java。如果我错了,请纠正我!
Nov 27, 2019 6:59:17 PM io.grpc.internal.ManagedChannelImpl$1 uncaughtException
SEVERE: [Channel<1>: (firestore.googleapis.com:443)] Uncaught exception in the SynchronizationContext. Panic!
java.lang.IllegalStateException: Could not find policy 'pick_first'. Make sure its implementation is either registered to LoadBalancerRegistry or included in META-INF/services/io.grpc.LoadBalancerProvider from your jar files.
at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.<init>(AutoConfiguredLoadBalancerFactory.java:97)
at io.grpc.internal.AutoConfiguredLoadBalancerFactory.newLoadBalancer(AutoConfiguredLoadBalancerFactory.java:67)
at io.grpc.internal.ManagedChannelImpl.exitIdleMode(ManagedChannelImpl.java:379)
at io.grpc.internal.ManagedChannelImpl$ChannelTransportProvider$1ExitIdleModeForTransport.run(ManagedChannelImpl.java:473)
at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
at io.grpc.internal.ManagedChannelImpl$ChannelTransportProvider.get(ManagedChannelImpl.java:477)
at io.grpc.internal.ClientCallImpl.startInternal(ClientCallImpl.java:257)
at io.grpc.internal.ClientCallImpl.start(ClientCallImpl.java:190)
at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1.start(CensusTracingModule.java:394)
at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1.start(CensusStatsModule.java:695)
at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:32)
at com.google.api.gax.grpc.GrpcHeaderInterceptor$1.start(GrpcHeaderInterceptor.java:94)
at com.google.api.gax.grpc.GrpcDirectStreamController.startCommon(GrpcDirectStreamController.java:115)
at com.google.api.gax.grpc.GrpcDirectStreamController.start(GrpcDirectStreamController.java:101)
at com.google.api.gax.grpc.GrpcDirectServerStreamingCallable.call(GrpcDirectServerStreamingCallable.java:68)
at com.google.api.gax.grpc.GrpcServerStreamingRequestParamCallable.call(GrpcServerStreamingRequestParamCallable.java:61)
at com.google.api.gax.grpc.GrpcExceptionServerStreamingCallable.call(GrpcExceptionServerStreamingCallable.java:59)
at com.google.api.gax.rpc.WatchdogServerStreamingCallable.call(WatchdogServerStreamingCallable.java:69)
at com.google.api.gax.rpc.ServerStreamingCallable$1.call(ServerStreamingCallable.java:237)
at com.google.api.gax.rpc.ServerStreamingAttemptCallable.call(ServerStreamingAttemptCallable.java:230)
at com.google.api.gax.rpc.ServerStreamingAttemptCallable.start(ServerStreamingAttemptCallable.java:193)
at com.google.api.gax.rpc.RetryingServerStreamingCallable.call(RetryingServerStreamingCallable.java:87)
at com.google.api.gax.tracing.TracedServerStreamingCallable.call(TracedServerStreamingCallable.java:76)
at com.google.api.gax.rpc.ServerStreamingCallable$1.call(ServerStreamingCallable.java:237)
at com.google.api.gax.rpc.ServerStreamingCallable.serverStreamingCall(ServerStreamingCallable.java:166)
at com.google.api.gax.rpc.ServerStreamingCallable.serverStreamingCall(ServerStreamingCallable.java:178)
at com.google.cloud.firestore.FirestoreImpl.streamRequest(FirestoreImpl.java:474)
at com.google.cloud.firestore.FirestoreImpl.getAll(FirestoreImpl.java:243)
at com.google.cloud.firestore.FirestoreImpl.getAll(FirestoreImpl.java:253)
at com.google.cloud.firestore.FirestoreImpl.getAll(FirestoreImpl.java:143)
at com.google.cloud.firestore.DocumentReference.get(DocumentReference.java:354)
at FirebaseHandler.getLehrer(FirebaseHandler.kt:95)
at HtmReader.readFile(HtmReader.kt:12)
at MainView.theStuff(MainView.kt:61)
at MainView.onDock(MainView.kt:44)
at tornadofx.UIComponent.callOnDock$tornadofx(Component.kt:700)
at tornadofx.UIComponent$rootSceneWindowShowingPropertyChangeListener$1.changed(Component.kt:556)
at tornadofx.UIComponent$rootSceneWindowShowingPropertyChangeListener$1.changed(Component.kt:327)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:72)
at javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144)
at javafx.stage.Window.setShowing(Window.java:922)
at javafx.stage.Window.show(Window.java:937)
at javafx.stage.Stage.show(Stage.java:259)
at tornadofx.App.start(App.kt:101)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
我的(在这种情况下)下载东西的代码如下:
fun getLehrer(): HashMap<String, Any> {
[...]
val out = HashMap<String, Any>()
try {
val future = firestore.collection("stuff").document("lehrer").get()
future.await()
if (future.isDone) {
[...]
}
} catch (ex: Exception) {
println(" ++ cant get lehrer liste")
}
[...]
}
错误发生在这一行:
val future = firestore.collection("stuff").document("lehrer").get()
几天来我一直在尝试解决这个问题,实际上花了几个小时在谷歌上搜索并尝试不同的东西,但到目前为止对我来说没有任何效果!
我试过:
- 随机添加 LoadBalancer,因为我找不到任何可行的文档
- 将负载均衡器添加到我的 META-INF/services
- 我还在这里发现了一些看起来相似的东西(https://github.com/grpc/grpc-java/issues/5493),但它谈到了很多我不使用的东西,坦率地说不明白
仅供参考:奇怪的是,我的资源文件夹中的图标在 Jar 中变成了完全不同的图标。不要问我为什么。我也找不到答案,但这不是什么大问题,因为我可以在罐子里替换它。
哦,这也是我的第一个问题,所以如果我犯了任何错误,我很抱歉!我可能也犯了一些拼写错误,对此我深表歉意。
任何帮助将不胜感激!
解决方案
嘿,所以在谷歌搜索更多之后,我发现了一篇文章列出了 LoadBalancerRegistry (https://www.codota.com/code/java/classes/io.grpc.LoadBalancerRegistry)的代码片段,我在其中滚动并找到了这个:PickFirstBalancerFactory 。在里面()
所以我决定寻找这个工厂但找不到它,而是找到了 PickFirstLoadBalancerProvider()。记住,为了向 LoadBalancerRegistry 注册一些东西,需要一个 Provider。
长话短说,我将它们都设置在一起,并将以下内容添加到我班级的 init 部分,现在它工作正常!
LoadBalancerRegistry.getDefaultRegistry().register(PickFirstLoadBalancerProvider())
如果有人有同样的问题,我想我应该回答!
仅供参考:图标仍然会变成那个奇怪的图标。我不知道为什么或者怎么可能,但是如果我在 .jar 中替换它就可以了,所以我真的不在乎 xD
推荐阅读
- adal - 令牌中的acquireTokenAsync 缺少deviceId
- ruby-on-rails - 如何在 Localhost 中查看 ROR App
- c# - CS0246 类型或命名空间“Newtonsoft”未找到
- node-red - 如何使节点红色的http重定向?
- python - 如果 CSS 或 XPATH 选择器不起作用,如何使用 Python Scrapy?
- r - R:与 data.table 一起使用时,函数会改变其输出的长度
- android-studio - 如何将项目返回到 Android Studio 中的上下文菜单
- javascript - 如何点击拇指,视频出现AngularJS?
- python - 根据 Pandas 中唯一行值的数量添加新列
- matlab - 相对于原始数组在不同位置重塑元素 - matlab