Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   HTTPS Post an Server in einer Queue senden (https://www.delphipraxis.net/202028-https-post-server-einer-queue-senden.html)

linxxruxx 20. Sep 2019 09:10

HTTPS Post an Server in einer Queue senden
 
Hallo,

ich arbeite noch nicht lange in Delphi. Habe zu meinem Thema viel gegoogelt und seh den Wald vor lauter Bäumen nicht mehr.

Folgendes:
Ich habe eine SQL-Lite Datenbank in Delphi erstellt, welche Aufträge enthält (ID, ServicePartnerID, Auftragsart,..., SentToServer).
Habe verschiedene Queries erstellt, um den Auftrag zu erstellen, zu befüllen und zu laden.
Diese Vorgänge geschiehen alle in der App, wenn jemand die Aufträge bearbeitet etc.
Änderungen werden also bei mir in Delphi in die SQL-Lite Datenbank in eine neue Tabelle (AuftraegeCache) gespeichert.
Nun möchte ich die bearbeiteten Aufträge auch, wenn Serververbindung besteht, ans Backend schicken.

Mein Plan:
- In einer Unit eine MemTable mit den geänderten Aufträgen der AuftraegeCache-Tabelle laden

- Die Memtable durchgehen und auf den Boolean (SentToServer = false) prüfen

- Ist der Eintrag der Memtable auf false, geh in eine Warteschlange und warte dort so lange bis Verbindung zum Server besteht

- Wurde Verbindung zum Server hergestellt, versende den Auftrag an den Server

- Kommt eine Antwort vom Server, dass das Senden erfolgreich war, setzte das Feld SentToService auf True

- nächsten Eintrag der Memtable und alles von vorne-




Die Memtable zu befüllen, in einer
Code:
while not Memtable.Eof
durch die Memtable gehen und auf
Code:
if FDMTAuftragCache.FieldByName('SentToServer') = false then
prüfen habe ich bereits gemacht..
Wie ich allerdings in der if-Anweisung eine Queue erstelle und den Auftrag dann an den Server schicke weiß ich allerdings überhaupt garnicht ...

Es wäre so lieb, wenn mir jemand hilft.
Ich weiß ihr braucht immer Code-Beispiele aber mehr als das was ich erklärt habe, habe ich derzeit nicht.



Delphi-Quellcode:
unit SendeCacheUnit;

interface

uses FireDAC.Comp.Client, FireDAC.Comp.DataSet, Data.DB,
   Data.FireDACJSONReflect, DBHelperUnit;

procedure SendeCache(Sender: TObject);

implementation

procedure SendeCache(Sender: TObject);
Var
   FDMTAuftragCache: TFDMemTable;
   LDataSetList: TFDJsonDataSets;
begin


   FDMTAuftragCache := TFDMemTable.Create(nil);                                         //erstelle die Tabelle und füge Felder hinzu
   FDMTAuftragCache.FieldDefs.Add('id', ftInteger, 0, false);
   FDMTAuftragCache.FieldDefs.Add('ServicePartnerID', ftInteger, 0, false);
   FDMTAuftragCache.FieldDefs.Add('BenutzerID', ftInteger, 0, false);
   FDMTAuftragCache.FieldDefs.Add('Auftragsart', ftString, 0, false);
   FDMTAuftragCache.FieldDefs.Add('Status', ftString, 0, false);
   FDMTAuftragCache.FieldDefs.Add('Zeitstempel', ftString, 0, false);
   FDMTAuftragCache.FieldDefs.Add('ZeitstempelUpdate', ftInteger, 0, false);
   FDMTAuftragCache.FieldDefs.Add('SentToServer', ftBoolean, 0, false);

   LDataSetList := DBHelperUnit.DBHelper.ladeAuftraegeCache;                            //befülle die Tabelle durch die Datenbankabfrage
   FDMTAuftragCache.AppendData(TFDJSONDataSetsReader.GetListValue
      (LDataSetList, 0));
   FDMTAuftragCache.Open;

   while not FDMTAuftragCache.Eof do                                                    //solange nicht am Ende Der Tabelle, geh durch die Tabelle
   begin

      if FDMTAuftragCache.FieldByName('SentToServer') = false then                      //wenn noch nicht an den Server gesendet wurde, geh in die Anweisung
      begin

//hier soll der Eintrag in einer Queue warten, bis Serververbindung besteht und dann mittels HTTPs den Eintrag an den Server schicken..
//wenn dann Antwort vom Server kommt, wird der Boolean SentToServer auf true gesetzt und man beginnt mit dem nächsten Auftrag


      end;

   end;

end;

end.
Viele Grüße

Schokohase 20. Sep 2019 09:45

AW: HTTPS Post an Server in einer Queue senden
 
Wofür eine MemTable? So etwas speichert man in der lokalen SQLite, damit dieser Zustand (übertragen an Backend) auch einen Neustart der Anwendung übersteht.

linxxruxx 20. Sep 2019 09:49

AW: HTTPS Post an Server in einer Queue senden
 
Ich speichere die Änderungen doch in einer lokalen SQL-Lite.
Dachte nur, ich muss irgendwie drauf zugreifen, damit ich nur die ans Backend schicke, welche SentToServer = False sind.
Nach erfolgreichem Senden ändere ich den Wert auf True.

Wenn eine Memtable nicht richtig ist, dann wäre ich über einen zusätzlichen Vorschlag super dankbar.

Viele Grüße

Schokohase 20. Sep 2019 10:05

AW: HTTPS Post an Server in einer Queue senden
 
Es geht nicht um die MemTable, sondern darum, dass NUR die MemTable etwas dürftig ist, weil die Information auch in die lokale Datenbank selber zurückgeschrieben werden sollten.

Du kannst auch nebenbei noch ein Lied pfeifen, einen Drachen steigen lassen oder in der Nase bohren. Hauptsache die Daten werden zurück in die Datenbank geschrieben.

Du hast davon aber nirgends etwas geschrieben und darum habe ich gefragt, denn ich kann einiges aber nicht Gedanken lesen.

linxxruxx 20. Sep 2019 10:13

AW: HTTPS Post an Server in einer Queue senden
 
"Änderungen werden also bei mir in Delphi in die SQL-Lite Datenbank in eine neue Tabelle (AuftraegeCache) gespeichert."

Also die Änderungen werden in die Datenbank geschrieben.
Zum Einen in die ursprüngliche lokale Tabelle (Auftraege) und zum anderen in eine Cache Tabelle (AuftraegeCache).
Aus der AuftraegeCache sollen sie irgendwann auch wieder gelöscht werden.

Es tut mir leid, wenn ich mich nicht so gut ausdrücken kann. Das ist keine böse Absicht von mir.
Und ich weiß auch, dass die Arbeit, die ihr auch noch völlig kostenfrei leistet, sehr gut ist.

Schokohase 20. Sep 2019 10:24

AW: HTTPS Post an Server in einer Queue senden
 
Wo werden die Aufträge erstellt?

Speziell geht es mir darum, wie die ID des Auftrags erzeugt wird. Wie ist da die Logik um doppelte IDs zu vermeiden?

Rolf Frei 20. Sep 2019 10:35

AW: HTTPS Post an Server in einer Queue senden
 
Besteht denn das Backend schon und gibt es da eine Schnittstelle die du per HTTP nutzen kannst? Das Schicken an den Webserver ist jetzt noch das kleinste Problem (z.B. mit Indy idHttp), wenn da noch garkeine Schnittstelle besteht.

linxxruxx 20. Sep 2019 10:41

AW: HTTPS Post an Server in einer Queue senden
 
Die Aufträge werden im Backend erstellt und an meine SQL-Lite Datenbank geschickt und rein geschrieben. Ich hole mir in Delphi lediglich die bereits vom Backend befüllte Tabelle "Auftrag".

Ich habe eine DBHelperUnit geschrieben. Darin sind alle Queries hinterlegt, welche ich in Delphi nutze.
Darin gibt es dann verschiedene Queries für die Aufträge, die ich aus der Datenbank lade, um sie in der App anzuzeigen oder zu bearbeiten (CreateAuftrag, LadeAuftrag, UpdateAuftragStatus zb.)

Wird in der App dann etwas geändert, werden die Änderungen z.B über die "UpdateAuftragStatus"-Query wieder zurück in die eigentliche Datenbanktabelle "Auftrag" geschrieben.
Parallel werden die Änderungen dann aber auch in die Datenbanktabelle "AuftragCache"geschrieben.
Diese Tabelle ist quasi eine Kopie-Tabelle der eigentlichen Tabelle "Auftrag", nur dass sie am Anfang leer ist und erst befüllt wird, wenn Änderungen kommen.

Aus dieser "AuftragCache" sollen dann die Daten auch noch an das Backend geschickt werden (Ist eine Webanwendung).
Im Backend wird der Auftrag dann über die ID gesucht und geupdated mit einem Zeitstempel.


Eine Schnittstelle gibt es schon an das Backend. Jap ich kann diese über http nutzen.
--> Über Indy und idHttp etc hab ich schon viel gelesen, nur weiß ich nicht wie ich das schreiben kann, wenn ich einen kompletten Datenbank-Eintrag versenden will.

Rolf Frei 20. Sep 2019 11:01

AW: HTTPS Post an Server in einer Queue senden
 
Was du machen willst ist mir absolut klar, aber das wird nicht einfach so gehen. Das Backend muss mit deinen Daten zurecht kommen.

Wie du das senden musst, bestimmt das Backend. Du musst dann nur noch die URL wissen und die die vom Backend benötigten Parameter, entsprechend übergeben (via HTTP POST oder GET).

Ich vermute mal, dass das was du da genau machen willst, so nicht direkt gehen wird. Ich bezweifle dass das Backend genau dafür eine Funktion hat. Wenn es im Backend über HTTP eine Schnittstelle gibt, um Auftrage einzulesen, müsstest du deine lokalen DB-Daten in das geforderte Format bringen (ev. JSON, XML oder halt per HTTP POST/GET Parameter) und diese dann an den HTTP-Server senden.

linxxruxx 20. Sep 2019 11:05

AW: HTTPS Post an Server in einer Queue senden
 
Okay, ja das werde ich auf jedenfall mit einem Kollegen abklären, wie das Backend die Daten erwartet.

Ist das mit der Queue denn umsetzbar? Das bedeutet: so lange in der Queue bleiben, bis Kontakt zum Server besteht?
Ich weiß absolut nicht wie ich das angehen kann, würde wenigstens schon mal den Kopf dafür basteln und dann den Inhalt (was ich sende) noch abklären.

Danke für die Antworten.

Rolf Frei 20. Sep 2019 11:20

AW: HTTPS Post an Server in einer Queue senden
 
Weiss nicht genau was du hier mit "Queue" meinst. Wenn es deine Tabelle ist die du mit "while not eof" durcharbeiten willst, dann geht das auf jeden Fall.

Dir Frage ist dann halt, ob das Backend nur einzelne Aufträge verarbeiten kann oder ob es eventuell alle Aufträge in Form einer JSON/XML Datei verarbeiten kann. Muss jeder Auftrag aleine verarbeitet werden, musst du halt für jeden Auftrag die Daten an das Backend senden. Pro Auftrag also einen Webaufruf. Wenn er mehrere Aufträge mit einer JSON/XML Datei einlesen kann, reicht ein einzelner Aufruf mit der von dir zuerst zusammen gestellen JSON/XML Datei mit allen Aufträgen deiner Queue.

linxxruxx 20. Sep 2019 11:30

AW: HTTPS Post an Server in einer Queue senden
 
Es soll in der "while" quasi geprüft werden, ob die Variable "SentToServer" false ist, denn nur dann wurde der Eintrag noch nicht an das Backend gesendet.
Danach soll geprüft werden ob Verbindung zum Server besteht, wenn das nicht der Fall ist, soll der Eintrag solange in einer Warteschleife bleiben, bis Serververbindung besteht.
Besteht die Verbindung, wird der Eintrag gesendet und im Anschluss die Variable "SentToServer" auf true gesetzt.
Die While-Schleife ist durch und es geht mit dem nächsten Eintrag weiter.

Und das soll ich iwie in einer Queue machen, aber das weiß ich eben nicht so recht.

Jeder Auftrag muss alleine verarbeitet werden, da es ja Änderungen am Auftrag sind.
Man kann es sich so wie Events vorstellen: AuftragStauts = "Angenommen" wäre dann ein Event. Wird er aber während keine Verbindung zum Server besteht auch noch "Erledigt", wäre das ein nächstes Event.

Aus diesem Grund hat die Tabelle Auftrag/AuftragCache auch einen Zeitstempel, damit mit dem ersten, also ältesten Eintrag/Event begonnen wird, in das Backend zu schreiben.

Rolf Frei 20. Sep 2019 12:04

AW: HTTPS Post an Server in einer Queue senden
 
Zitat:

Zitat von linxxruxx (Beitrag 1447234)
Jeder Auftrag muss alleine verarbeitet werden, da es ja Änderungen am Auftrag sind.
Man kann es sich so wie Events vorstellen: AuftragStauts = "Angenommen" wäre dann ein Event. Wird er aber während keine Verbindung zum Server besteht auch noch "Erledigt", wäre das ein nächstes Event.

Wie das Ganze verarbeitet wird ist eigentlich egal. Das müsste ja dann das Backend machen. Ob du da alle Queue Aufträge mittels XML oder nur einzlene senden kannst, bestimmt das Backend und nicht du im Client. Die Verarbeitung passiert ja dann auch im Backend und wie das da gemacht wird, muss dich nicht intressieren. Du musst ihm nur die Daten so anliefern wie er sie erwartet.

In deinem Fall wäre es aber schon einfacher, wenn das Backend nur einzelne Aufträge verarbeitet, da du so pro Webaufruf auch gleich die eindeutige Antwort bekommen kannst, ob die Verarbeitung geklappt hat. Diese Info wirst du vom Webserver als Antwort auf deine Webanfrage zurück bekommen. Aber auch im anderen Fall müsstest du dann halt vom Server eine XML Datei mit allen Infos zur Verarbeitung retour bekommen. Darin würden dann die Auftragsnummer und das Resultat der Verarbietung drin stehen. Diese würdest du dann auswerten und deine lokale DB entsprechend aktualisieren.

Mal noch eine andere Frage die mir nicht ganz klar ist: Wie bekommst du die Aufträge vom Backend? Hast du da eine DB-Verbindung zum Backend (per TCP) und wenn ja, wieso muss das dann per Umweg über HTTP passieren?

linxxruxx 23. Sep 2019 07:15

AW: HTTPS Post an Server in einer Queue senden
 
Zitat:

Zitat von Rolf Frei (Beitrag 1447236)
Mal noch eine andere Frage die mir nicht ganz klar ist: Wie bekommst du die Aufträge vom Backend? Hast du da eine DB-Verbindung zum Backend (per TCP) und wenn ja, wieso muss das dann per Umweg über HTTP passieren?

Derzeit besteht noch garkeine Verbindung zum Backend. Habe meine SQL-Lite Datenbank in Delphi selbst befüllt und spiele mit diesen Daten rum.
Aus diesem Grund ist ganz klar, dass das alles noch geklärt werden muss in welchem Format die Daten geliefert werden müssen.
Mir geht es ja eigentlich um die Queue, dass ich absolut nicht weiß, wie ich solch eine schreiben soll.
Welche Daten in welchem Format dann letztendlich geschickt werden, kann ich momentan dann noch ein wenig ignorieren.
Ich hätte einfach nur super gern schon einmal das Gerüst gebaut.
Dh. In der While: Auftrag bleibt so lange in der Queue bis Verbindung zum Server besteht und eine positive Antwort vom Server für den Auftrag zurück kommt.

Wie könnte so eine Queue denn ca aussehen? Also prüfen ob Kontakt zum Server ist und auf die Antwort (SentToServer = True) warten?
Das Backend verarbeitet somit jeden Auftrag einzeln, da jeder Auftrag auch so lange in der Queue sein soll, bis eine positive Antwort zurück kommt, danach erst der nächste. Oder?

Schokohase 23. Sep 2019 08:02

AW: HTTPS Post an Server in einer Queue senden
 
Aus dem was du bisher geschrieben hast, würde ich im Moment folgendes erstellen:

Data
- Id (integer, PK)
- Version (datetime)
- DataField (...)

DataQueue
- Id (integer, PK)
- DataId (integer)
- DataVersion (datetime)
- DataField (...)

Bei jeder Änderung in Data wird ein Eintrag in die Tabelle DataQueue angehängt.
Diese DataQueue Tabelle wird dann an das Backend gesendet.
Wurde ein Datensatz aus der DataQueue erfolgreich übertragen, dann wird der aus der DataQueue entfernt.

Das Erstellen und Löschen von Datensätzen am Client ist bei diesem Konzept nicht vorgesehen.

linxxruxx 23. Sep 2019 13:44

AW: HTTPS Post an Server in einer Queue senden
 
Okay super vielen Dank !

Ich weiß jetzt, dass das Backend ein XML erwartet.
Die Frage ist jetzt nur noch, wie ich aus jedem Eintrag der Tabelle ein XML-File generieren kann?
Gibt es da schon irgendwelche Funktionen ?

XML Mapper z.B. lässt mich ein XML-File in die Datenbank importieren.
Nun möchte ich ja aus einem Tabelleneintrag ein XML-File erstellen, dazu habe ich leider nicht wirklich etwas hilfreiches gefunden.


Danke für die Mühe und Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz