Welche Programmierpraktiken verursachen, dass Tridion meldet, dass eine Sitzung in einem anderen Thread verwendet wird?

8

Beim Überprüfen der Ereignisprotokolle auf meinem Tridion Content Management Server (ich verwende die Version 2009) sehe ich Warnungen, die sagen:

%Vor%

Welche Programmier- / Templating-Praktiken werden dies wahrscheinlich verursachen?

EDIT: Bis jetzt hatten wir einige gute Vorschläge:

  1. Speichern Sie Ihr Sitzungsobjekt nicht in einer statischen Variablen (Chris)
  2. Speichern Sie Ihre Engine oder Ihr Paket nicht in einer statischen Variablen (Miguel)

Tatsächlich handelt es sich bei beiden um solides Gold, und Sie sollten Ihren eigenen Code für diese Anti-Muster überprüfen. (Die Engine hat einen Verweis auf eine Sitzung, das macht Sinn.) Ich habe jedoch die Codebasis durchsucht, die das Problem verursacht, und ich habe keine davon gefunden. Also - hat jemand noch mehr Ideen? Ich würde auch Vorschläge begrüßen, wie man solche Dinge debuggen oder den problematischen Code eingrenzen kann.

    
Dominic Cronin 18.04.2012, 15:32
quelle

4 Antworten

9

Das Problem tritt nicht nur beim Speichern einer Sitzung auf, sondern auch beim Speichern eines beliebigen TOM.NET-Objekts ( Component , Page usw.). Jedes dieser Objekte hat einen internen Verweis auf die Sitzung, die von jedem Zugriff auf das Objekt erstellt wurde, muss möglicherweise zur Sitzung zurückkehren, um die angeforderten Informationen von Tridion abzurufen.

Obwohl die meisten Eigenschaften, die für den Elementtyp "nativ" sind, scheinbar abgerufen und in einer Instanz beibehalten werden, kann ein Aufruf wie LoadApplicationData (zurück) auf die Sitzung zugreifen (müssen), um auf die angeforderten Daten zuzugreifen. Und wenn dieser Aufruf dann in einem anderen Thread passiert, erhalten Sie die Warnmeldung, die Sie erwähnen.

Ich habe begonnen, mir jedes TOM.NET-Objekt anzusehen, das ich mit Argwohn behalte, und lade viele Daten vor, die ich später vielleicht brauche, wenn ich das Objekt zum ersten Mal aus seiner Sitzung lade.

    
Frank van Puffelen 07.05.2012, 21:08
quelle
8

Ich möchte auch einen Kommentar basierend auf früheren Erfahrungen hinzufügen. Die folgenden Szenarien:

  • Sitzung und / oder Engine und / oder Paket werden in statischen Variablen
  • gespeichert
  • Sitzung und / oder Engine und / oder Paket werden als Parameter an eine Methode gesendet, die Static
  • ist

Kann mehrere Probleme verursachen, abgesehen von Speicherverlusten während der Veröffentlichung.

Publisher beginnt, Speicher zu verbrauchen, bis er nicht mehr reagiert (Sie können weder stoppen noch neu starten oder deaktivieren) und Sie müssen den Server neu starten.

Diese Probleme können bei massiven Veröffentlichungen immer schlimmer werden

So wird empfohlen, dass alles, was Sitzung, Engine, Paket verwendet, in nicht statische

konvertiert werden soll

Als Beispiel wird aus dem folgenden Code, der zum Initialisieren von allen Vorlagen verwendeten Utilities verwendet wird,

gewechselt %Vor%

in

%Vor%

Kann viele Probleme speichern

    
Miguel 19.04.2012 18:27
quelle
6

Ich habe festgestellt, dass dieser Fehler auftritt, wenn Sie das Sitzungsobjekt in einer statischen Variablen in einer Vorlage speichern. Es funktioniert einwandfrei im Debug-Modus, aber sobald ich einen Multithread-Publisher (d. H. Mehr als einen Rendering-Thread) starte, wird dieses Problem von einem hässlichen Kopf ausgelöst.

    
Chris Summers 18.04.2012 16:46
quelle
0

Ein anderes Szenario besteht darin, dass Ihr Ereignissystem, Ihre Vorlage oder Ihr Workflow-Code untergeordnete Threads startet und die Sitzungs- oder Engine-Objekte in diese ohne entsprechende Sperren übergibt.

Im Wesentlichen alles, was außerhalb des Modells der Single-Threaded Apartments liegt, auf dem die Objekte Engine und Session basieren: Ссылка

    
Nickoli Roussakov 18.10.2012 03:21
quelle

Tags und Links