top of page

Sage 100 Applikationsserver Fehler "Die Anzahl der aktiven Servicedomains (Sagede.ApplicationServer.ServiceDomainDescription) per Context (XYZ) ist überschritten."

(alle Versionen/all versions)

Montag, 22. Juli 2024

Deutsch


Fehlermeldung im Sage TraceLog

In der Praxis hatte sich bei einem unserer Kunden folgende Meldung im Sage TraceLog gehäuft.


Der Effekt war derart, dass entsprechend häufig Anfragen an den Sage Applikationsserver fehlschlugen.


Die Anzahl der aktiven Servicedomains (Sagede.ApplicationServer.ServiceDomainDescription) per Context (XYZ) ist überschritten.

Um genau herauszufinden, welche Einstellung im Sage Applikationsserver Management dies betrifft, kann man wie folgt recherchieren.


Recherche im Quellcode des Sage Applikationsservers

Ausgangspunkt ist die DLL "Sagede.ApplicationServer.dll" des Sage Applikationsservers.


In der "Sagede.ApplicationServer.dll" schaut man zunächst einmal mit einem geeigneten Tool (z.B. Telerik JustDecompile oder ILSpy) in die Ressourcen-Texte der DLL und sucht dort die entsprechende Meldung heraus.


Im konkreten Fall ist dies folgende Meldung:

[ServiceDomainManagerMaxActivContextLog, Die Anfrage konnte nicht ausgeführt werden. Grund: Die Anzahl der aktiven Servicedomains ({0}) per Context ({1}) ist überschritten. {2}]

Es geht demnach um die Ressource mit der ID "ServiceDomainManagerMaxActivContextLog".


Eine weitere Kontextsuche mit einem geeigneten Tool (z.B. Telerik JustDecompile) im "decompilierten" .net-Code der "Sagede.ApplicationServer.dll" ergibt folgende relevante Fundstelle zu dieser Ressource.


D.h., dies ist die Stelle im Sage Quellcode der "Sagede.ApplicationServer.ServiceDomainManager"-Klasse, an der die o.g. Meldung für das Sage TraceLog generiert wird.


Dabei fällt auf, dass offensichtlich die Methode "TryGetServiceDomain" der "Sagede.ApplicationServer.ServiceDomainManager"-Klasse nicht erfolgreich ist.


Auszug:


public ServiceDomain GetServiceDomain(IServiceIsolationDescription 
serviceIsolationDescription)
{  
ServiceDomainQuotaResult serviceDomainQuotaResult;
  ServiceDomain serviceDomain = this.TryGetServiceDomain(serviceIsolationDescription, out serviceDomainQuotaResult);
if (serviceDomainQuotaResult == ServiceDomainQuotaResult.MaxPerContextExceeded)
{
try
 {     LogHelper.LogWarning(Resources.ServiceDomainManagerMaxActivContextLog, new object[] { serviceIsolationDescription.ServiceDomainDescription(this._usedForAsynchronServices), ServiceDomainManager.GetContextQuotaKey(serviceIsolationDescription), this.GetLogMessageIsolationInfo() });
}
finally
{
PerformanceCounterWriter.ServiceCallRejected();
}
throw new TimeoutException(Resources.ServiceDomainManagerTimeoutError);
...

Man sieht , dass am Ende eine Timout-Exception geworfen wird.

In den Zeilen zuvor fällt auf, dass der Applikationsserver versucht, mit "TryGetServiceDomain" eine neue Service-Domäne anzufordern.

Folglich sollte man sich genauer den Quellcode der Methode "TryGetServiceDomain" der "Sagede.ApplicationServer.ServiceDomainManager"-Klasse ansehen.


Die entscheidende Code-Stelle ist dort:

quotaResult = this._quota.TryEnter(ServiceDomainManager.GetContextQuotaKey(serviceIsolationDescription), serviceDomainDescription.ContextQuotaMax, serviceDomainDescription.ContextQuotaTimeout);

"serviceDomainDescription.ContextQuotaMax" verweist auf eine Konfigurationseigenschaft namens "ContextQuotaMax".


Eine semantische Suche im decompilierten Sage Klasse "Sagede.ApplicationServer.Administration.Plugin.Configuration.VmAsCoreConfigurationData" zeigt die exakte Definition dieser Eigenschaft.

[Description("Definiert die maximale Anzahl von Anfragen, die von einem Client parallel ausgeführt werden können (0=unbeschränkt).")]
[Display(ShortName="Max. Anzahl paralleler Anfragen pro Client", GroupName="Isolationsräume")]
[Range(0, 10, ErrorMessage="Max. Anzahl paralleler Anfragen pro Client muss zwischen 0 und 10 liegen.")]
public int ContextQuotaMax ...

Interessant ist letzten Endes das Display-Attribut.

Dieses zeigt die Beschreibung, die sich auch im Sage Server Manager-Konfigurationsprogramm findet:

Max. Anzahl paralleler Anfragen pro Client

Dadurch hat man einen Ansatzpunkt, um die Konfiguration entsprechend passend für den Kunden feinzujustieren.






bottom of page