在WebLogic中部署时,Neo4j REST服务无法保存

时间:2013-11-26 16:13:35

标签: java neo4j spring-data-neo4j weblogic12c

我遇到以下设置问题:

  • 带有REST服务的Neo4j 1.9.4数据库
  • 连接到所述REST服务的Web应用程序,构建于Spring Data Neo4j 2.3.1.RELEASE之上。其他技术并不值得注意,值得注意的是SDN的传递依赖性为1.9。见下文。
  • 所述web-app部署到WebLogic进行生产,Tomcat用于本地开发

摘自Maven依赖关系树

    [INFO] +- org.springframework.data:spring-data-neo4j-rest:jar:2.3.1.RELEASE:compile
    [INFO] |  +- org.neo4j:neo4j-rest-graphdb:jar:1.9:compile
    [INFO] |  |  \- org.neo4j:server-api:jar:1.9:compile
    [INFO] |  |     +- org.neo4j.3rdparty.javax.ws.rs:jsr311-api:jar:1.1.2.r612:compile
    [INFO] |  |     +- commons-configuration:commons-configuration:jar:1.6:compile
    [INFO] |  |     |  \- commons-beanutils:commons-beanutils-core:jar:1.8.0:compile
    [INFO] |  |     \- commons-digester:commons-digester:jar:1.8.1:compile
    [INFO] |  |        \- commons-beanutils:commons-beanutils:jar:1.8.0:compile

问题是:SDN的save API在部署到WebLogic时不起作用。尝试检索任何@NodeEntity时,网络应用仍然没有问题。但是当应用程序尝试执行保存(我尝试过的API列表,下面)时,它总是会抛出错误。

我尝试了什么(两者产生相同的结果,错误):

    repository.save(U entity);
    neo4jTemplate.save(T entity);

我注意到的奇怪事情是:

  • 当我的应用通过左GraphDatabaseFactory.databaseFor(url)连接到Neo4j服务器时,我可以在Node上运行保存(@NodeEntity的SDN仍然无法正常工作。通过new SpringRestGraphDatabase(restUri)连接后Node@NodeEntity都不起作用。这两个API都返回org.neo4j.graphdb.GraphDatabaseService
  • 的后代
  • 即使在当地环境中也很容易复制。我认为它是一个网络问题,但当我试图在我的本地同时拥有Neo4j服务器和WebLogic服务器时,问题仍然存在。
  • 我原以为这是一个交易问题,因为检索没有问题,但正如Michael Hunger here所提到的,Neo4j Server中没有真正的交易。所以它不应该导致问题。

堆栈跟踪:

    ]] Root cause of ServletException.
    com.sun.jersey.api.client.ClientHandlerException: java.net.SocketTimeoutException: Read timed out
            at com.sun.jersey.api.client.ClientResponse.close(ClientResponse.java:603)
            at org.neo4j.rest.graphdb.RequestResult.extractFrom(RequestResult.java:83)
            at org.neo4j.rest.graphdb.ExecutingRestRequest.put(ExecutingRestRequest.java:151)
            at org.neo4j.rest.graphdb.ExecutingRestAPI.setPropertyOnEntity(ExecutingRestAPI.java:340)
            at org.neo4j.rest.graphdb.RestAPIFacade.setPropertyOnEntity(RestAPIFacade.java:135)
            Truncated. see log file for complete stacktrace
    Caused By: java.net.SocketTimeoutException: Read timed out
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.read(SocketInputStream.java:129)
            at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
            at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
            at weblogic.net.http.KeepAliveStream.close(KeepAliveStream.java:115)
            Truncated. see log file for complete stacktrace
    >

Tomcat(REST和嵌入式)都可以正常工作 嵌入式数据库中的一切工作正常(即使在WebLogic中)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

该异常抛出com.sun.jersey.api.client.ClientResponse

/**
     * Close the response.
     * <p>
     * The entity input stream is closed.
     *
     * @throws ClientHandlerException if there is an error closing the response.
     */
    public void close() throws ClientHandlerException {
        try {
            entity.close();
        } catch (IOException e) {
            throw new ClientHandlerException(e);
        }
    }

此时Weblogic 12中的InputStream实现是weblogic.net.http.KeepAliveStream
代码204返回No Content,然后weblogic将其标记为未完整下载内容。

这里的解决方案是在启动你的weblogic时使用-DUseSunHttpHandler = true(bin / startWebLogic.cmd)

set JAVA_OPTIONS=%JAVA_OPTIONS% -DUseSunHttpHandler=true

的问候,