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

我首先假设将容器分成2个可能是个问题,但是我进行了以下测试:
我的机器上的本地Tomcat中运行RD4J工作台
-连接到云上的rdf4Jmyserver
->一切正常!
因此,pb不能在2个单独的地方运行。

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

漫长的一天后,尽管该代码与以前的版本一样古老,但我在Workbench代码中发现了错误:Sesame:没人抓住它。

今天的理念:
Bluemix效果很好,但是在云中推送应用程序可以揭示旧的弱点!

我将在下一篇文章中提供补丁。

最佳答案

说明:
如果通过工作台选择的服务器不是默认服务器(应该位于同一根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,可以看到:

公共java.lang.String getContextPath()

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

因此,可以通过以下方式修复此古老的隐藏错误:

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


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

高温超导

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

关于java - 为什么RDF4J在Bluemix Cloud Foundry中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42958045/

10-10 06:19