Servlet für viele Benutzer

Looky

Erfahrenes Mitglied
Hallo,

mir geht es nun ersteinmal nur um's Prinzip.

Also, ich habe ein Servlet. An dieses sende ich ein Kommando. Anschließend berechnet das Servlet etwas (dauert ca 10 sek.) und gibt es dann aus.

Wenn nun aber User 2 innerhalb der 10 sek. etwas anderes an das Servlet sendet. Was passiert dann? Und kann ich irgendwie eine Kopie des Servlets für jeden eigenen User erzeugen, sodass jeder User mit einem eigenen Servlet-Objekt arbeitet?

Danke euch
Christian
 
Hallo,

Wenn nun aber User 2 innerhalb der 10 sek. etwas anderes an das Servlet sendet. Was passiert dann? Und kann ich irgendwie eine Kopie des Servlets für jeden eigenen User erzeugen, sodass jeder User mit einem eigenen Servlet-Objekt arbeitet?
Standardmäßig wird beispielsweise im Tomcat (wenns ein extends HttpServlet-Servlet ist) eine Servlet Instanz erzeugt, dessen Service-Methode dann von den jeweiligen Requestverarbeitenden Threads aufgerufen wird. Wenn du bei dieser Konfiguration nun Zustand im Servlet hälst also (in Instanz Variablen speicherst), so wird dieser zwischen den Beutzern geshared... was zu locking Problemen / race conditions und sonstigen Concurrency Problemen führen kann. Wenn du keinen Zustand hälst ist das absolut kein Problem da die Aufrufe der service()-Methode durch die Request-Threads voneinander unabhängig sind.

Wenn du doch im Servlet Zustand halten jedoch nicht aufwendig concurrency berücksichtigen möchtest, kannst du auch das SingleThreadModel Interface Implementieren. Das garantiert dir dann, das 2 Threads nie gleichzeitig die service()-Methode deines Servlets aufrufen werden. Entweder übernimmt der Servlet-Container dann die Synchronisation und / oder Pooled die Servlet Instanzen und verwendet für jeden Request eine andere Servlet Instanz.

Was nicht theadsafe ist sind Zugriffe auf die HttpSession bzw. ServletContext, hier musst du entsprechend synchronisieren.

Gruß Tom
 
Seit wann erzeugst du denn Servlets selber? Servlets sollten (im Sinne von "du solltest beim Programmieren darauf achten, dass sie threadsafe sind") laut Spec threadsafe sein, da der Container für unterschiedliche Anfragen mehrere Threads aufmacht und u.U. an die gleiche Instanz delegiert.

"Jeder User mit einer Servletinstanz". Wenn User bei dir Client meint klingt für mich nach StatefulSessionBean. Die Frage, die sich aber stellt ist: Warum willst du das? Stateless Architekturen (die dadurch implizit Threadsafe sind) skalieren deutlich besser als welche, die Zustand haben. Also: was hast du vor? :)

REINHAUN!

PS: Tom war schneller :D
 
Moin,

was ich vorhabe ist folgendes:

Es geht um ein Webfrontend, welches per XML-RPC an einen Service Anfragen stellen kann.

Beispiel wäre eine Suchfunktion inkl. Autocomplete. Sprich Client1 will nach "Hallo Welt" suchen. Er gibt ein "Hallo W" und Autocomplete schlägt dann "Hallo Welt" vor usw...

So und um sowas zu machen habe ich eine JavaScript Funktion (Ajax) die anfragen an ein Servlet stellt. Weil eine Menge anfragen gestellt werden war mir dabei halt wichtig zu wissen, was passiert wenn Client1 eintippt "Hallo W" und Client2 gleichzeitig "Microso". Kommt das Servlet dann durcheinander oder nicht?

Ich denke, das ich spätestens Threadprobleme bekomme, bei einem Caching.

Angenommen ich erzeuge eine Klasse, die die Einträge aus dem Service zwischencacht und ich mit der Autocomplete diese Klasse nutze. Es sei denn ich synce das oder erzeuge jedesmal ein neues Objekt.

Sehe ich das richtig?
Christian
 
und Statefull bedeutet für dich, dass ich irgendein Zustand speichere, der bei einem anderen Client aber ganz anders sein könnte was?

Wie sieht es denn mit der Caching Methode aus? Wie würdest du/ würdet ihr das machen?

Mein Vorschlag war ja, eine Klasse zu Erzeugen, die sich mit Intervall Abfragen auf dem neusten Stand hält. Das Servlet sollte dann eine Methode
Code:
getResults(String searchstrr)
oder so ansprechen. Komme ich hier ann in Probleme, wenn 2 Clients diese Methode gleichzeitig aufrufen oder denk ich hierbei einfach zu kompliziert?

Danke
Christian
 
Stateful heißt (nicht nur für mich): clientspezifischer Zustand:

Java:
private String foo;

public void setFoo(String foo);
  this.foo= foo;
}

public String getFoo() {
  return foo;
}

Wenn Client X jetzt setFoo ruft, ist der gesetzte Wert auch für Client Y sichtbar. Solang das okay ist gibt es kein Problem. Dein Cache ist ein gutes Beispiel. Der ist sicherlich für alle Sichtbar. D.h. ein Wert der durch die Anfrage von User X da drin landet ist auch für User Y valide. Wiederum heißt das, dass der Cache von verschieden Usern aufgebaut und genutzt wird -> kein Clientspezifischer Zustand -> alles i.O..

Gruß
Ollie
 
hm, stimmt wenn ich so drüber nachdenke. Wenn ich mir den Cache als Liste von Elementen vorstelle, da kann ich mit 1 Mio User gleichzeitig reingreifen, solange ich nix veränder geht das wie erwünscht.

Methoden die den Cache ändern würden (setFoo) müssten dann wohl gesynct werden.

Eins versteh ich aber immernoch nicht ganz. Wenn die Methode getFoo gerade beschäftigt ist, für Client 1 Daten zusammen zu sammeln, und Client 2 nun auch anfängt anfragen zu stellen, dan die selbe Methode. Kommt es dann nicht zu überschneidungen?

Christian
 
Zurück