Direkt zum Hauptbereich

Struts RequestProcessor

In einer älteren Struts 1.x Webanwendung gab es Probleme mit Speicherlecks. Im Laufe der Analyse stieß ich auf die Klasse org.apache.struts.action.RequestProcessor. Sie instanziiert bei Bedarf die Actionklassen, speichert sie zwischen und verwendet diese Instanzen für eingehende Requests wieder. Das Problem der Webanwendung bestand darin, dass am Ende der Requestverarbeitung die Daten der Actionklassen (große ResultSets aus SQL Statements ect.) nicht sauber aufgeräumt wurden. Da die Actionklasseninstanzen vom RequestProcessor weiter gehalten werden, greift die Garbage Collection nicht. Somit verbrauchte jede Actionklasse sehr viel Speicher für veraltete Daten. Außerdem waren die Klassen entgegen des Hinweises in der Dokumentation (siehe Kapitel 4.4.1) nicht thread-safe. Dies machte sich durch Exceptions (z.B.: java.util.ConcurrentModificationException) bzgl. konkurrierender Zugriffe auf Daten der Actionklassen bemerkbar. Durch die große Anzahl der Actionklassen war eine Analyse / Überarbeitung jeder Klasse nicht möglich. Daher bestand die einfachste Lösung darin, dem RequestProcessor das Cachen und die Wiederverwendung der Actioninstanzen abzugewöhnen:
  1. Eine eigene Klasse anlegen, die von org.apache.struts.action.RequestProcessor erbt:
    public class MyRequestProcessor extends RequestProcessor
  2. Methode protected Action processActionCreate(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException überschreiben und das speichern der Instanzen deaktivieren.
  3. Nun muss man Struts sagen, dass der eigene RequestProcessor verwendet werden soll. Hierzu muss folgender Eintrag in der struts-config.xml vorgenommen werden:
    <controller processorClass="de.mnau.mypackage.MyRequestProcessor"/>
Somit wird für jeden Request eine neue Instanz der Actionklasse erzeugt. Der Speicher wird schnell wieder freigegeben, da die Instanzen nun von der Garbage Collection aufgeräumt werden können und die parallelen Zugriffe auf die Actionklassen wurde unterbunden, da jeder Request nun seine eigene Instanz erhält.

Beliebte Posts aus diesem Blog

Chromium App Modus in Gnome

Um einzelne Webseiten im Gnome Desktop via Chromium App Modus als eigene Anwendung zu registrieren, geht man wie folgt vor (Beispiel Whatsapp Web): Eine neue .desktop Datei unter /home/[USER]/.local/share/applications anlegen [Desktop Entry] Name=Whatsapp Exec=chromium --app=https://web.whatsapp.com --new-window StartupNotify=true Terminal=false Type=Application Icon=[PFAD ZUM ICON] StartupWMClass=web.whatsapp.com Nun sollte ein neuer Eintrag in den Gnome Anwendungen vorhanden sein Damit die Fenster unter dem Anwendungsnamen gruppiert werden, muss der Wert StartupWMClass korrekt gesetzt werden. Hierfür startet man die Anwendung und parallel eine Terminalsession. Im Terminal startet man den Befehl "xprop WM_CLASS". Mit dem Fadenkreuz klickt man nun das geöffnete Chromium Fenster an. Die Ausgabe im Terminal enthält nun: WM_CLASS(STRING) = "web.whatsapp.com", "Chromium" Die erste Zeichenkette ist der Wert für den Parameter "StartupWMClass".

Virtualbox 6.1 unter Debian 11 (Bullseye) installieren

Aktuell gibt es noch kein offizielles Virtualbox Repository für Debian 11. Ein entsprechendes Ticket dazu (siehe  https://wiki.debian.org/VirtualBox#Debian_11_.22Bullseye.22 ) gibt es bereits. Wie folgt lässt sich die aktuelle Version aus dem Virtualbox Debian 10 (Buster) Repository installieren: Das entsprechende Repository hinzufügen, falls noch nicht geschehen: https://www.virtualbox.org/wiki/Linux_Downloads Die aktuelle Version von libpvx5 downloaden: wget http://ftp.uni-mainz.de/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3+deb10u1_amd64.deb Als root installieren: apt install ./libvpx5_1.7.0-3+deb10u1_amd64.deb Virtualbox installieren: apt-get install virtualbox-6.1 Fertig!

Firefox on Linux - Hardwarebeschleunigung aktivieren

Systeminformationen Betriebssystem: Debian Bullseye Firefox: 102 Vorab mittels Befehl "vainfo" prüfen, ob VA-API funktioniert. Firefox Einstellungen Anschließend müssen in "about:config" folgende Settings gesetzt werden: gfx.webrender.all                            = true gfx.x11-egl.force-enabled                    = true media.ffmpeg.vaapi.enabled                    = true media.ffvpx.enabled                           = false media.rdd-vpx.enabled                        = false media.navigator.mediadatadecoder_vpx_enabled = true Überprüfung Nach einem kompletten Firefox Neustart sollte das Ergebnis unter "about:support" in der Sektion "Grafik" sichtbar sein: Compositing        = WebRender HW_COMPOSITING     = available by default OPENGL_COMPOSITING = available by default X11_EGL            = available by default VAAPI              = force_enabled by user Bei dem Parameter Compositing muss beachtet werden, dass der Zusatz "Software" ni