Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#11

AW: DataSnap Client connection über FireDAC

  Alt 22. Aug 2014, 23:20
Erganzend dazu: Der ClientCallbackManager braucht einen kleinen Patch, damit er nach einem Verbindungsabbruch wieder funktioniert.
Welchen meinst du?

Callbacks habe ich zumindest aus Thin Clients durch erneute Verbindungsversuche wiederherstellen können ohne dass ich etwas geändert hätte.
Den Patch brauchte ich in einer XE3 App und ich habe es unter XE6 noch nicht wieder probiert, denke aber es ist dort immer noch so.

Kurz: Bei verbundenem Client den Server neu starten. Nun funktionieren die Callbacks nicht mehr und der Client kann die auch nicht mehr registrieren. Das lässt sich nur mit einem Neustart des Clients beheben (genauer mit dem Neuerzeugen des CallbackManagers).

Lang: In TDSClientCallbackChannelManager.CloseClientChannel wird das interne Feld FStopped gesetzt, wenn der Server die Verbindung beendet. Dabei werden aber die Callbacks nicht freigegeben. Ruft man dann TDSClientCallbackChannelManager.CloseClientChannel auf, ist der ExcuteRemote-Aufruf zum einen vollkommen überflüssig (die Verbindung ist ja definitiv weg) und läuft zum anderen in einen Timeout (kostet unnütz Zeit). Das nachfolgende FLocalCallbackRepo.Clear und das Anpassen der Statevariablen wird nicht mehr aufgerufen. Die Callbacks bleiben also im Dictionary und man kann Sie somit nicht mehr neu anlegen (RegisterCallback sieht, die sind schon da und gibt false zurück). Die alten Callbacks funktionieren aber nicht mehr, weil sie beim Server nicht mehr registriert sind (der wurde ja neu gestartet).

Der Patch besteht im Wesentlichen darin, bei FStopped das ExecuteRemote zu überspringen und trotzdem das FLocalCallbackRepo.Clear aufzurufen. Bei XE3 liegt der Code in Datasnap.DSHTTPCommon und bei XE6 in Datasnap.DSCommon.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat