HTTP ServerThread

Status
Nicht offen für weitere Antworten.

Roland34

Mitglied
2.Post weil ich es in falscher Stelle gepostet hatte.


Hat jemand eine Idee über Thread Handling in Java http server?
Ich habe die HTTP server wie unten implementiert. Ich möchte bei jeder Client Verbindung (wie z.B. Aktualisierung der Web Seite) eine Datanbankabfrage laufen und die Werte im Bildschirm ausgeben. Funktioniert soweit.

String response = QueryManager.runQuery();

Aber mein Problem ist dass bei jedem Client Zugriff wird ein neues Thread erzeugt. Das möchte ich vermeiden, wegen Speicherüberlauf.
Aber wenn ich das Response als statische Variabel definiere, passiert das nicht. wie z.B. String response = "test";

Code:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.Calendar;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class MyHTTPServer implements HttpHandler {

  HttpServer server;

  String myname;


  String mydesc;

  int port = 8080;

  class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException {
      String response  = QueryManager.runQuery();
      if (response.length() == 0) {
        response = "0";
      }
      // System.out.println(response);
      t.sendResponseHeaders(200, response.length());
      OutputStream os = t.getResponseBody();
      os.write(response.getBytes());
      os.close();
    }
  }

  public MyHTTPServer() throws IOException {
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 100);
    server.createContext("/", new MyHandler());
    server.setExecutor(null);
    server.start();

  }

  public void read(InputStream is) {
  }

  public static void main(String argv[]) {
    try {
      new MyHTTPServer(); // start the result server
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void handle(HttpExchange arg0) throws IOException {
   
   
  }

}
 
Danke Alex.
Bin etwas neu zum Socket Konzept in java. Habe versucht es mit dem Beispiel aber mir scheint es etwas komplexer.

Was mir brennend interessiert ist, warum wird mehrere Threads für
Code:
String response = QueryManager.runQuery();
erzeugt?
Aber nicht bei

Code:
String response  = "response";

Vielleicht verpasse ich ein ganz einfaches Konzept!
 
Kein Plan was du da treibst... Prinzipiell müsste das bei dir so funktionieren:

Für jede eingehende Anfrage wird ein Objekt erzeugt, welches "Runnable" implementiert. In dessen "run()" Methode arbeitest du die Anfrage ab und gibst das Ergebnis zurück.

Zentral in deiner Webserveranwendung erstellst du einen Thread-Pool, z.B. so:

Code:
ExecutorService threadPool = Executors.newFixedThreadPool(20);

Und die Runnables steckst du dann so rein:

Code:
threadPool.execute(meinAnfrageRunnableObject);

Der Pool kümmert sich dann um dessen Ausführung und entscheidet wann welche Anfrage dran kommt.

"Executors" kennt noch weitere statische Methoden zum Pool erzeugen:

- Executors#newCachedThreadPool()
- Executors#newSingleThreadExecutor()
- Executors#newFixedThreadPool(int size)

Gruß
Alex
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben