2012-11-11 69 views
1

我想發送一個非常大的http post請求來獨立neo4j服務器(neo4j-community-1.9.M01)。Neo4j不能接受大的http休息請求

波紋管是我正在使用的示例代碼。 (250k)

問題是,我無法控制大量的web服務器啓動的設置,它是由一個或多個輸入文件:ideas/src/test/test-rest.txt包含一個非常大的json字符串neo4j的獨立版本可能有一些限制在網絡服務器,阻止我發送大的帖子請求。有人可以幫我找出這個設置。 另類:有人可以告訴我如何更換默認的網絡服務器。Neo4j的例如用 的錯誤,我收到了客戶端上的Tomcat是:

Caused by: java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    at java.io.FilterOutputStream.write(FilterOutputStream.java:80) 
    at org.apache.commons.httpclient.WireLogOutputStream.write(WireLogOutputStream.java:86) 
    at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor$3.writeRequest(DefaultApacheHttpMethodExecutor.java:186) 
    at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499) 
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114) 
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
    at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:210) 

以下是從Web客戶端的一些日誌:

[email protected]:28:01 INFO (HttpMethodDirector.java:445)  - Retrying request 
[email protected]:28:01 DEBUG (HttpConnection.java:692)  - Open connection to localhost:7474 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "POST /db/data/batch HTTP/1.1[\r][\n]" 
[email protected]:28:01 DEBUG (HttpMethodBase.java:1352)  - Adding Host request header 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "Accept: application/json; stream=true[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "X-Stream: true[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "Content-Type: application/json[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "User-Agent: Jakarta Commons-HttpClient/3.1[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "Content-Length: 246292[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "Host: localhost:7474[\r][\n]" 
[email protected]:28:01 DEBUG ( Wire.java:70)  - >> "[\r][\n]" 
[email protected]:31:22 DEBUG (HttpMethodDirector.java:404)  - Closing the connection. 
[email protected]:31:22 DEBUG (HttpMethodDirector.java:434)  - Method retry handler returned false. Automatic recovery will not be attempted 
[email protected]:31:22 DEBUG (HttpConnection.java:1178)  - Releasing connection back to connection manager. 

下面是客戶端代碼:

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.client.apache.ApacheHttpClient; 
import org.apache.commons.io.FileUtils; 
import org.neo4j.rest.graphdb.RequestResult; 
import org.neo4j.rest.graphdb.UserAgent; 

import javax.ws.rs.core.MediaType; 
import java.io.*; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.HashMap; 
import java.util.Map; 

import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; 

public class Main { 
    private static final UserAgent userAgent = new UserAgent(); 
    public static final MediaType STREAMING_JSON_TYPE = new MediaType(APPLICATION_JSON_TYPE.getType(),APPLICATION_JSON_TYPE.getSubtype(), stringMap("stream","true")); 

    public static void main(String[] args) throws URISyntaxException, IOException { 
     String data = FileUtils.readFileToString(new File("ideas/src/test/test-rest.txt")); 
     Client client = createClient(); 
     WebResource resource = client.resource(new URI("http://localhost:7474/db/data/batch")); 
     WebResource.Builder builder = resource.accept(STREAMING_JSON_TYPE).header("X-Stream", "true"); 
     builder.entity(toInputStream(data), APPLICATION_JSON_TYPE); 
     System.out.println(RequestResult.extractFrom(builder.post(ClientResponse.class))); 
    } 

    private static InputStream toInputStream(String data) throws IOException { 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(4024 * 1024); 
     outputStream.write(data.getBytes()); 
     byte[] buf = outputStream.toByteArray(); 
     ByteArrayInputStream inputStream = new ByteArrayInputStream(buf); 
     return inputStream; 
    } 


    protected static Client createClient1() { 
     Client client = Client.create(); 
     client.setConnectTimeout(800); 
     client.setReadTimeout(800); 
     client.setChunkedEncodingSize(80 * 1024); 
     userAgent.install(client); 
     return client; 
    } 

    protected static Client createClient() { 
     Client client = ApacheHttpClient.create(); 
     return client; 
    } 

    private static Map<String, String> stringMap(String stream, String aTrue) { 
     HashMap<String, String> result = new HashMap<String, String>(); 
     result.put(stream, aTrue); 
     return result; 
    } 

} 

在此先感謝。

回答

0

我找到了問題的原因。 我在VirtualBox 4.2.0下運行Windows XP客戶機和Windows 7主機機器。 將服務器放在另一臺機器上後,問題消失。 我用wireshark調查,在失敗之前,我看到很多未被確認並因此被重新傳輸的tcp包。

我的問題仍然是打開的:如何用tomcat替換neo4j使用的默認webserver?