【问题标题】:Why RDF4J won't work in Bluemix Cloud Foundry为什么 RDF4J 不能在 Bluemix Cloud Foundry 中工作
【发布时间】:2017-03-23 00:53:32
【问题描述】:

RDF4J 是一个 apache 开源图形数据库,我经常在我的 PC 上使用它。
它带有 2 个 webApp:RDF4J-serverRDF4J-workbench(一个用户界面)
在我的 PC 上,我在同一个 Tomcat 中推动了 2 场战争,一切正常。
我开始进行一项实验,以将这些应用程序推送到 Bluemix Cloud(这是一家云代工厂)
java-tomcat 样板需要一个 War 以便将其与新容器的 URL 相关联,因此我在 2 个 java 容器中创建 2 个单独的应用程序
1 个用于 RDF4J-Server,
1 个用于 RDF4J-WB。
两个应用程序都在运行,我可以访问默认页面。
在 WB 中,“连接到服务器”表单允许您提供要使用的服务器的 URL。
我输入 URL https://rdf4jmyserver.mybluemix.net。 WB 找到服务器但在表单上循环,无法打开数据库。

我想首先拆分 2 个容器可能是个问题,但我做了以下测试:
- 在我的机器上的 本地 Tomcat 中运行 RD4J 工作台
- 连接到 云端的 rdf4Jmyserver
-> 一切正常!
所以 pb 不能在 2 个不同的地方运行。

我进行了更多调查,下载源代码(感谢开源)并使用越来越多的调试跟踪重新编译。

经过漫长的一天后,我发现了 Workbench 代码中的错误,尽管该代码与之前的版本芝麻一样古老:没有人发现它。

今天的理念:
Bluemix 运行良好,但在云中推出应用程序可能会暴露老弱点!

我将在下一篇文章中给出补丁。

【问题讨论】:

    标签: java ibm-cloud rdf4j


    【解决方案1】:

    说明: 当工作台选择的服务器不是默认服务器时(应该在同一个根 url 上),程序会建立一个新的 cookie 来跟踪新的选择。

    错误的代码在这里,在CookieHandler.java中:

    private void initCookie(final Cookie cookie, final HttpServletRequest req) {
        final String context = req.getContextPath();
         cookie.setPath(null == context ? "/" : context);
        }
    }
    

    网址类似于 https://rdf4j-mywb.mybluemix.net
    因此,当 cookie 没有上下文时,软件想要添加 / 。
    但是这段代码是假的

    回到java API,可以看到:

    public java.lang.String getContextPath()

    返回请求 URI 中指示请求上下文的部分。
    上下文路径始终位于请求 URI 的首位。
    路径以“/”字符开头,但不以“/”字符结尾。
    对于默认(根)上下文中的 servlet,此方法返回“”。 strong>
    容器不解码这个字符串。

    所以这个老埋的bug可以通过以下方式修复:

    // cookie.setPath(null == context ? "/" : context);
    cookie.setPath(context.isEmpty()? "/" : context);
    

    现在,Workbench 在 Bluemix 上运行良好!

    HTH

    PS:由于 rdf4Jserver 也运行在云容器中,当容器重置时,磁盘上的数据可能会消失。必须完成另一项工作:在 Bluemix 中使用对象存储服务。 (改天)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 2016-09-22
      相关资源
      最近更新 更多