send riesige "Query" to servlet

sindylee2

Mitglied
Moin alle Experten,

ich habe ein Problem beim Senden von einem riesigen (MegaByte) String zu Servlet, Es hängt entweder ab oder nach lange Zeit s****** ein Exception aus: "query is null". Bei kleinem "String" klappt das gut. Wie kann man besser machen?

Java:
//Kleintseite Code: 
String query =
            ....
            "&" + "plan=" + plan+  //plan is der riesige String....
            "&" + "xslt=" + encodedxslt;
            
        DataProvider dp = DataProvider.getInstance();
        String servletUri = ....;   
        // make the connection
        
        URL servletURL = new URL(servletUri);
        URLConnection urlConnection = servletURL.openConnection();
        HttpURLConnection connection = (HttpURLConnection)urlConnection;
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setRequestProperty("accept", DataProviderDefinitions.CONTENT_TYPE_BINARY_DATA + ", " + DataProviderDefinitions.CONTENT_TYPE_PLAIN_TEXT);
        connection.setReadTimeout(0);
       .......
        //send Query
         OutputStream os = connection.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.print(query);            
            pw.flush();
            .....
 
Zuletzt bearbeitet:
I

irgendjemand

Gast
@MOD

jo man sollte lesen können ... er versendet seinen request via HTTP-POST ... *fail*


@TO

falls du zugriff drauf hast : wirf mal einen blick ins server-log ... es könnte sein das du irgendwelche LIMIT oder TIMEOUT werte überschreitest und der server daher die verarbeitung abbricht ...
auch interressant : bis zu welche größe läuft das gewünschte und ab wann treten probleme auf ? wie hoch ist dein upstream zum server oder testet du lokal / im lan ?

ein paar wenig infos um effektiv helfen zu können
 

sindylee2

Mitglied
es sage einfach "query is null", auf kleintseite und Server-log habe ich die wichtige Infomationen ausgegeben. die Ausgabe von Kleintseit sind alle vernünftig, aber auf serverseite gibt gar nichts aus ausser das "NullPointerException" ....:((((


hat das eingentlich mit Query-length zu tun? wie kann man das herausfinden, wo das Problem liegt, ist das wirklich die String zu lang? oder irgendwann wurde die Verbindung unterbrochen?
 

Empire Phoenix

Top Contributor
Versuch mal dieses stück hier, das setzte ich in einem System ein und es hat bislang nie fehler gemacht.

Wesentlicher unterschied ist eigntlich, dass ich viel weniger krams setze, dafür aber das encoding explizit angebe.

Java:
		 URL url = new URL(weburl); 
		 URLConnection conn = url.openConnection();
		 conn.setDoOutput(true);
		 OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(),"Cp1252");
		 writer.write(data);
         writer.flush();

Am rande, kannst du plz die zeile und den genauen wortlauf worauf sich die excpetion bezieht markieren?
 
Zuletzt bearbeitet:

sindylee2

Mitglied
Danke, aber leider funktioniert auch nicht:cry:

ich habe noch mal so versucht:
Java:
URL servletURL = new URL(servletpath);
                URLConnection urlConnection = servletURL.openConnection();
                connection = (HttpURLConnection)urlConnection;
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setRequestMethod("PUT");
                connection.setRequestProperty("accept", DataProviderDefinitions.CONTENT_TYPE_BINARY_DATA + ", " + DataProviderDefinitions.CONTENT_TYPE_PLAIN_TEXT);
                connection.setReadTimeout(0);
.......

//sed request
if(connection != null)
        {
 
          OutputStream os = connection.getOutputStream();
          
          if(os == null)
          {
              throw new Exception("CWAPIForWebServlet.takePlanForEditorial(..): OutputStream is null.");
          }
          
          DataOutputStream dos = new DataOutputStream(os);
          
          // send the parameter
          
          dos.writeUTF(encodedUrlString); 
          dos.writeUTF(encodedxslt);         
          ObjectOutputStream oo = new ObjectOutputStream(dos);
          oo.writeObject(plan);  //big monster!  (26MB)
         
          try
          {
              oo.close();
              
          } catch(Exception any){
          	System.out.println("Exception by oo close");
          }
          try
          {
              dos.flush();
              
          } catch(Exception any){
          	System.out.println("Exception by dos flush");
          }
          try
          {
              dos.close();
              
          } catch(Exception any){
          	System.out.println("Exception by dos close");
          }
          try
          {
              os.close();
              
          } catch(Exception any){
          	System.out.println("Exception by os");
          }        	


             //get Respons and disconnect...
             InputStream is = connection.getInputStream();   //beim Großen String macht here immer Error Code 500!  warum?
             .....
                    try
        {
            connection.disconnect();
            
        } catch(Exception any){}
            okay = (res != null && res.equals(DataProviderDefinitions.VALUE_TRUE));
        }

und das funktioniert auch nicht bei großen String.... hat das mit Base64 Encoding zu tun?
ich habe vorher versucht mit Base64.encode(plan); zu machen, aber das ist für "ObjectOutputStream"
nicht geeignet, gibt immer Fehlermeldung zurück, dann schicke ich einfach "plan" ohne Kodierung, dann hat zwar das ObjectOutputStream kein Problem mehr, aber arbeitet er nur für kleine String.......
 

Ähnliche Java Themen

Neue Themen


Oben