2016-05-12 11 views
0

Ich habe eine kleine Anwendung, die kontinuierlich im Hintergrund ausgeführt werden muss. Das Programm kann Verzeichnisüberwachungsdienste, HTTPS-Listener und andere Dienste einrichten, die als Teil des Hauptdienstthreads ausgeführt werden müssen.Wie kann eine CLI erstellt werden, die mit einem fortlaufend ausgeführten Dienst interagieren kann, ähnlich der Shell von MySQL?

Benutzer müssen jedoch auch mit dem Programm interagieren und Aufgaben manuell ausführen, verschiedene Einstellungen konfigurieren usw. Ich habe eine Befehlszeilenschnittstelle mit jline und argsparse4j erstellt, die es Benutzern ermöglicht, dies zu tun.

Ich kann den CLI-Hauptthread ausführen, der all die Dinge tun kann, die ich möchte, aber sobald ich den Thread schließe, werden alle diese Dienste mit dem Hauptthread beendet.

Ich habe dies mit Prozess-Builder und mit Shell-Skripten, die separate Instanzen des jvm starten bestimmte Prozesse laufen, entgegengesetzt, aber das fühlt sich einfach falsch an.

Ich muss hier das Beste aus beiden Welten kombinieren, indem ich einen beständigen Dienst habe, bei dem sich ein Benutzer im Wesentlichen anmelden und abmelden kann, aber alles lokal ist. Das erste, was einem einfällt, ist, wie sich MySQL verhält. MySQL läuft immer als Dienst, aber der Benutzer kann mysql mit einigen Anmeldeparametern und "login" in mysql eingeben, um Befehle auszuführen. Genau so möchte ich, dass mein Programm funktioniert.

Meine erste Idee war, einfach alle Funktionen in eine API einzubetten und möglicherweise ein Nachrichtenwarteschlangenprotokoll wie AMQP zu verwenden und dann die Befehlszeilenschnittstelle zum Senden von Nachrichten an den Dienst zu entkoppeln. Dies ist auch sehr sinnvoll, da wir auch eine HTTPS-REST-API auf demselben Client aktivieren, damit Remotebenutzer ihre Funktionalität nutzen können. Wir müssten also nur zwei Nachrichtenprotokolle innerhalb der API verarbeiten.

Ich frage mich jedoch, ob es bessere oder einfachere Alternativen als das Schreiben einer vollwertigen meldungsbasierten API gibt, die Client-Server ist?

Antwort

0

Letztendlich entschieden wir uns für die Route einer Backend-REST-API, die mit dem Spark Framework für Java implementiert wurde. Dies ist möglicherweise nicht das robusteste und das Feedback der Benutzer ist ein Problem. Wir haben unsere Befehlszeilenschnittstelle aufgeteilt, um REST-Aufrufe zu senden und Ergebnisse für den Benutzer anzuzeigen.