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/