首页 > 解决方案 > 编译的 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()

几天来我一直在尝试解决这个问题,实际上花了几个小时在谷歌上搜索并尝试不同的东西,但到目前为止对我来说没有任何效果!

我试过:

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

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

任何帮助将不胜感激!

标签: firebaseintellij-ideakotlingoogle-cloud-firestore

解决方案


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

所以我决定寻找这个工厂但找不到它,而是找到了 PickFirstLoadBalancerProvider()。记住,为了向 LoadBalancerRegistry 注册一些东西,需要一个 Provider。

长话短说,我将它们都设置在一起,并将以下内容添加到我班级的 init 部分,现在它工作正常!

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

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

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


推荐阅读