【问题标题】:Compiled Jar keeps throwing: Uncaught exception in the SynchronizationContext编译的 Jar 不断抛出: SynchronizationContext 中未捕获的异常
【发布时间】:2020-03-23 08:48:28
【问题描述】:

我一直在尝试制作一个小型应用程序,它首先扫描 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/服务中
  • 我还在这里发现了一些类似的东西 (https://github.com/grpc/grpc-java/issues/5493),但它谈到了很多我不使用的东西,坦率地说不明白

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

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

任何帮助将不胜感激!

-本尼

【问题讨论】:

    标签: firebase intellij-idea kotlin google-cloud-firestore


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 遇到了类似的问题,GrpclbLoadBalancerProvider 对我不起作用。但是,PickFirstLoadBalancerProvider 可以!
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多