Announcement

Collapse
No announcement yet.

Vermeiden von multiplen Threads bei refresh

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vermeiden von multiplen Threads bei refresh

    Hallo miteinander,
    ich habe folgendes Problem: in einer JSP-Seite deklariere (und initialisiere) ich eine sessionweite Variable auf die ich auch von anderen JSPs aus Zugriff habe mit: session.setAttribute("MyClient", new ClientMainClass(SessionID));
    Wenn ich nun irgendeine Aktion starte wie zB. ein Formular auslesen (request abschicken) etc. wird die ganze Seite refreshed. Damit wird leider diese Anweisung neu ausgeführt und ein neues Objekt erzeugt. Dies führt zu multiplen Objekten und damit zu multiplen Threads, die sich im Laufe der Anwendung gegenseitig in die Quere kommen (lesen und schreiben eine Datei gleichzeitig). In einem normalen Javaprogramm hätte ich die Variable wahrscheinlich als final deklariert, dann wäre es egal, wie oft der Code ausgeführt wird, aber hier? Wie kann ich es schaffen, daß beim Starten einer neuen Session nur einmal ein Objekt erzeugt wird und danach nicht mehr (auch nicht bei einem refresh)?
    Danke und bis dann
    Albrecht

  • #2
    Vielleicht habe ich das Problem nicht richtig verstanden...

    Dein Code sollte prüfen, ob in der Session bereits das Attribut hinterlegt ist. Wenn nicht, füge ein neues Objekt der Session hinzu. Also wird das Objekt nur einmal erzeugt und in die Session gepackt. Ungefähr also so

    HttpSession session = request.getSession(true);
    ClientMainClass clientMainclass = (ClientMainClass)session.getValue("MyClient");
    if (clientMainclass != null) {
    // Attribut bereits in Session
    } else {
    // put Attribut in Session
    clientMainclass = new ClientMainClass(SessionID);
    session.setAttribute("MyClient", clientMainclass);
    }

    Comment


    • #3
      Hi,

      Wenn Du die Variable wirklich nur setzen willst, wenn eine neue Session angelegt wird, dann verwende doch einen SessionListener.

      Code:
      public class MySessionListener implements HttpSessionListener {
       
        public void sessionCreated(HttpSessionEvent se) {
          HttpSession session = se.getSession();
          ClientMainClass clientMainclass = new ClientMainClass(session.getId()
      );
          session.setAttribute("MyClient", clientMainclass);
          //do somthing else
        }
       
        public void sessionDestroyed(HttpSessionEvent se) {
          HttpSession session = se.getSession();
          //do somthing else
        }
      }
      diesen Listener registrierst Du in Deiner web.xml:
      Code:
      <listener>    
          <listener-class>MySessionListener</listener-class>  
      </listener>
      MfG

      Comment


      • #4
        @ aleucht: genau. So ähnlich hab ich das auch gemacht.
        Was ich mir nicht vorstellen konnte, war, dass ich session.getValue abfrage, bevor ich ein session.setValue mache. Ich bin dabei von der Annahme ausgegangen, dass dabei einObjekt abgefragt werden müsste, was es eigentlich noch nicht gibt. Aber es wird nur ein Attribut in einer Hashmap des session-Objekts abgefragt, und das geht
        @ lulog1: Den SessionListener kannte ich noch nicht. Ich habe das Problem jetzt zwar anders gelöst (wenn auch nicht so elegant), aber der Listener kann mir später noch helfen.
        Danke
        Albrecht

        Comment

        Working...
        X