编译的 Jar 不断抛出: SynchronizationContext 中未捕获的异常

Ben*_*min 5 intellij-idea kotlin firebase google-cloud-firestore

我一直在尝试制作一个小型应用程序,它首先扫描 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)
Run Code Online (Sandbox Code Playgroud)

我的代码(在本例中)下载内容如下:

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")
        }

        [...]
    }
Run Code Online (Sandbox Code Playgroud)

错误发生在这一行:

val future = firestore.collection("stuff").document("lehrer").get()
Run Code Online (Sandbox Code Playgroud)

我已经尝试解决这个问题好几天了,实际上花了几个小时谷歌搜索并尝试不同的事情,但到目前为止没有任何效果对我有用!

我试过:

  • 由于我找不到任何可行的文档,因此随机添加一个 LoadBalancer
  • 将负载均衡器添加到我的 META-INF/services
  • 我还发现了一些看起来类似的东西(https://github.com/grpc/grpc-java/issues/5493),但它谈论了很多我不使用并且坦率地说不理解的东西

仅供参考:奇怪的是,我的资源文件夹中的图标在 Jar 中变成了完全不同的图标。别问我为什么。我也找不到答案,但这并不是什么大问题,因为我可以将其替换到罐子中。

哦,这也是我的第一个问题,所以如果我犯了任何错误,我很抱歉!我可能也犯了一些拼写错误,对此我深表歉意。

任何帮助将不胜感激!

Ben*_*min 6

嘿,在谷歌搜索更多内容后,我发现了一篇文章,列出了 LoadBalancerRegistry 的代码片段(https://www.codota.com/code/java/classes/io.grpc.LoadBalancerRegistry),我在其中滚动并发现了这个:PickFirstBalancerFactory 。在里面()

所以我决定寻找这个 Factory 但找不到它,而是找到了 PickFirstLoadBalancerProvider()。请记住,通过随机完成自动完成,为了向 LoadBalancerRegistry 注册某些内容,需要一个 Provider。

长话短说,我将它们设置在一起并将以下内容添加到我的类的初始化部分,现在工作正常!

LoadBalancerRegistry.getDefaultRegistry().register(PickFirstLoadBalancerProvider())

我想如果有人有同样的问题我应该回答!

仅供参考:图标仍然变成那个奇怪的图标。我不知道为什么或如何可能,但如果我将其替换到 .jar 中,它就会起作用,所以我真的不在乎 xD