In FoxCli enthalten
Windows-Dienste, geschrieben in Visual FoxPro.
Haben Sie einen PC mit einer VFP-exe und einem Timer, den jemand offen lassen muss, um Bestellungen zu importieren, ausstehende E-Mails zu versenden oder den nächtlichen Abschluss zu machen? FoxService macht daraus einen Windows-Dienst: Er startet mit dem Rechner, läuft weiter, auch wenn sich niemand anmeldet, startet neu, wenn er abstürzt, und schreibt in die Ereignisanzeige. Sie schreiben nur die Logik, in VFP.
FoxService gehört zum Installer und zur Lizenz von FoxCli: Er wird nicht extra gekauft. Ohne Lizenz läuft er vollständig, ohne Einschränkungen, und der Dienst meldet beim Start, dass er im Testmodus läuft.
Eine Klasse in src\main.prg, und jede öffentliche Methode ist ein Job. Die *!*-Zeile darüber sagt, wann er läuft. Das ist das Beispiel, das jedes neue Projekt mitbringt: ein Import von Bestellungen, der schon beim ersten Start funktioniert.
DEFINE CLASS OrdersService AS FoxServiceBase OF foxservice.prg OLEPUBLIC
*-- Every CSV that arrives in inbox\: its orders into the table.
*!* @watch inbox *.csv
PROCEDURE ImportOrders(tcPath, tcChange)
...
ENDPROC
*-- Every 30 seconds: how many orders are waiting.
*!* @every 30s
PROCEDURE CountPending
LOCAL lnPending
THIS.OpenOrders()
COUNT FOR status == "P" TO lnPending
THIS.Log("Pending orders: " + TRANSFORM(lnPending))
ENDPROC
*-- Every night: the summary of the day.
*!* @daily 23:55
PROCEDURE DailySummary
THIS.WriteSummary()
ENDPROC
ENDDEFINEDie CLI foxservice macht dasselbe ohne die IDE, und auf dem Server genügt die exe des Dienstes. Ihre Befehle sind auch Werkzeuge für einen KI-Agenten (foxservice_new, foxservice_build, foxservice_install…) über FoxStack, kostenlos.
foxservice new --name orders --folder C:\svc
foxservice build --folder C:\svc\orders
foxservice run --folder C:\svc\orders --for 1m
orders.exe install --account "NT SERVICE\orders" --startEin Dienst hat weder Bildschirm noch Benutzer: keine Formulare, kein MESSAGEBOX, kein Drucken auf einen Drucker. Code, der es versucht, bleibt nicht hängen: Der Job schlägt sofort fehl, und das Log nennt die Zeile und den Grund. Ein VFP-Fehler kommt von selbst ins Log, mit seiner Nummer und seiner Zeile, und der Dienst läuft weiter, deshalb schreibt man die Jobs ohne TRY ... CATCH.
Zum Programmieren Visual FoxPro 9 oder VFP Advanced 10.2 in 32 Bit, und FoxForge, das mit FoxCli installiert wird. Auf dem Server Windows mit der 32-Bit-Laufzeit von .NET 10: kein Visual FoxPro, weil seine Laufzeit im Ordner des Dienstes mitreist, und keine Lizenz, weil die Lizenz dem gehört, der kompiliert.
Das vollständige Handbuch kommt mit FoxForge, unter Hilfe > FoxService-Handbuch, auf Deutsch, Englisch und Spanisch. Es beginnt mit den ersten Schritten: dem Import von Bestellungen, Job für Job erklärt.
Nein. Sie schreiben eine VFP-Klasse. Die exe des Dienstes, die FoxService im Ordner dist\ neben Ihre DLL legt, kümmert sich um Installieren, Starten und Stoppen, um die Zeitpläne und um die Ereignisanzeige. Aus FoxForge müssen Sie nicht einmal eine Konsole öffnen: Installieren, Starten und Anhalten sind Knöpfe.
FoxServer beantwortet HTTP-Anfragen: Jemand ruft an, und Ihr Code antwortet. FoxCore führt Aufgaben im Hintergrund innerhalb Ihrer Anwendung aus, damit ihr Bildschirm solange nicht hängt. FoxService braucht keine geöffnete Anwendung: Er arbeitet von selbst, wenn seine Zeit kommt, zu einer Uhrzeit, in festen Abständen oder wenn eine Datei ankommt. Sie lassen sich zusammen nutzen, jeder mit seiner Lizenz.
Die von FoxCli: FoxService ist darin und in ihrem Installer enthalten. Die Lizenz gehört dem, der kompiliert; die Server, auf denen der Dienst läuft, brauchen keine. Ohne Lizenz läuft alles, ohne Einschränkungen, und der Dienst meldet beim Start einmal, dass er im Testmodus läuft.
Voreingestellt ist das Systemkonto (LocalSystem): Es erreicht jeden Ordner des Rechners, wie das Desktop-Programm, das er ersetzt. Für einen Netzwerkordner ein eigenes Konto des Dienstes (NT SERVICE\Name) oder ein Windows- oder Domänenbenutzer; das Kennwort wird beim Installieren abgefragt, ohne Echo.
Mit 1, dem voreingestellten Wert, stellen sich die Jobs an: Dauert ein Import zehn Minuten, wartet der Job, der alle 30 Sekunden läuft, und seine Runden werden solange übersprungen. Mit 2 oder mehr hält ein langer Job die kurzen nicht auf. Jeder ist ein eigenes VFP, mit seinen Variablen und seinen offenen Tabellen.
Ein VFP-Fehler kommt mit seiner Nummer und seiner Zeile ins Log, der Job zählt als fehlgeschlagen, und der Dienst läuft weiter. Ein Job, der seine Höchstzeit überschreitet (eine Stunde, wenn Sie nichts anderes sagen), wird aufgefordert aufzuhören; kehrt er nicht zurück, startet sich der Dienst in wenigen Sekunden selbst neu. Dreimal hintereinander, und dieser Job wird nicht mehr eingeplant, bis Sie ihn prüfen.
Auf einen Drucker nicht: Ein Dienst hat keine Benutzersitzung und keine Drucker. Der Job, der es versucht, schlägt sofort fehl, und das Log sagt es.
Ja, mit der Berichtslaufzeit: ReportToPdf nimmt die Seiten einer .frx, und der Dienst setzt das PDF zusammen. Die Seiten sind Bilder mit 300 dpi, der Text lässt sich also nicht markieren oder durchsuchen, und mit dieser Laufzeit läuft ein Job nach dem anderen.
Ja, mit VFP Advanced 10.2 in 32 Bit. Zwei Unterschiede: Es gibt keine Berichtslaufzeit, und es bleibt bei einem Job nach dem anderen.
Ja. Die Befehle der CLI foxservice sind MCP-Werkzeuge über FoxStack, kostenlos. Installieren braucht eine Administrator-Konsole: Hat der Agent keine, bekommt er den genauen Befehl, den ein Mensch ausführen soll.
Wenn etwas nicht zusammenpasst, schreiben Sie mir: soporte@irwinrodriguez.dev