1

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 运行良好,但在云中推出应用程序可能会暴露老弱点!

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

4

1 回答 1

1

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

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

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

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

回到 java API,可以看到:

公共 java.lang.String getContextPath()

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

所以这个旧的埋藏的错误可以通过以下方式修复:

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

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

高温高压

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

于 2017-03-22T16:53:32.003 回答