自定义请求处理程序在启动时失败

Custom request handler fails at startup

我正在编写自定义 RequestHandler,从 ThreadedHttpRequestHandler 扩展,在 运行 vespa-deploy preparevespa-deploy activate 之后,日志显示重复出现的错误。

[2018-12-27 01:09:42.950] ERROR   : container        Container.com.yahoo.jdisc.core.StandaloneMain
JDisc exiting: Throwable caught:
exception=
java.lang.RuntimeException: Binding configured for non-jdisc request handler my.package.MyRequestHandler
at com.yahoo.container.jdisc.ConfiguredApplication.addHandlerBindings(ConfiguredApplication.java:348)
at com.yahoo.container.jdisc.ConfiguredApplication.intitializeAndActivateContainer(ConfiguredApplication.java:178)
at com.yahoo.container.jdisc.ConfiguredApplication.start(ConfiguredApplication.java:130)
at com.yahoo.jdisc.core.ApplicationLoader.start(ApplicationLoader.java:154)
at com.yahoo.jdisc.core.StandaloneMain.run(StandaloneMain.java:43)
at com.yahoo.jdisc.core.StandaloneMain.main(StandaloneMain.java:34)

我的 services.xml 现在看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<services version="1.0">
    <container version="1.0">
        <document-api />
        <handler id="my.package.MyRequestHandler" bundle="my-vespa-bundle">
            <binding>http://*/myendpoint</binding>
        </handler>
        <nodes>
            <node hostalias="node1"/>
        </nodes>
    </container>
</services>

我已经尝试通过代码尽可能多地进行跟踪,看起来有一个针对配置列表的检查 Components 这个异常来自哪里,但我不清楚为什么我的Handler 并没有被它接受。

vespa-deploy prepare 没有显示关于我的代码或配置结构的任何其他投诉。

您的处理程序未被提取的最可能原因是您已将 RequestHandler class 嵌入到您自己的包中。这将防止 JDisc 框架的 class 加载器将您的处理程序识别为它用作参考的 RequestHandler 的子 class。您可以通过 运行 mvn dependency:tree 来验证这一点。您可能会在 compile 范围内看到一些 vespa 依赖项,但它们应该是 provided.

请查看我们 sample projectdependencies 部分,并尝试相应地更新您的 pom.xml