[c#] Java Anwendung per Shutdownhook aus C# Programm beenden

mdo

Mitglied
Hallo alle zusammen!
Ich habe da ein kleines Problem:

Ich habe ein Java-Programm, welches sich bei einem shutdownhook von Außen "anständig" beendet. Es wartet auf alle Threads und beendet sich dann. Dies Funktioniert auch bestens unter Linux.

Nun will ich dieses Javaprogramm allerdings auf einem Windowsserver laufen lassen und von Außen mit einem C# Programm beenden. Allerdings schießt Process.kill() den Prozess einfach nur ab und CloseMainWindow() bewirkt genau garnichts...
Also wie kann ich aus einer C# Anwendung ein Javaprogramm beenden, indem ich ihm ein shutdownhook sende?
Hat jemand da Erfahrung oder wenigstens eine Idee?

MfG
mdo

PS:
Die .jar Datei des Javaprogramms habe ich mit JAR2EXE in eine .exe Datei umgewandelt.
Bei dem Javaprogramm handelt es sich um ein Serverprogramm ohne GUI.
Bei der C# Anwendung handelt es sich um ein Programm, welches als Tray-Icon fungiert.
 
Ui, doch so viele Antworten ^^

Naja, ich habe meine Überlegungen mittlerweile etwas weiter angestrengt und habe eventuell eine alternative Lösung:

Ich müsste vom C# Prozess einen C# Service per Remote ansprechen, und dann vom C# Service per Remote das Java Programm ansprechen. Eine Idee wie das geht?
Ich weiß, dass man mit .NET 3.5 über Pipes das ganze machen kann... Allerdings entwickle ich für .NET 2.0 und im Javaprogramm kann ich das wohl komplett vergessen...

Also:
  1. Kommunikation zwischen C# Prozess und C# Service, so dass der Service eine Methode starten kann, welche Verbindung mit dem Javaprogramm aufnehmen kann
  2. Kommunikation zwischen dieser C# Service Methode und einem Javaprogramm, so dass das Javaprogramm eine Methode zum eigenen Beenden ausführen kann

Was haltet ihr von diesem alternativen Ansatz? Kennt sich damit jemand aus? Wäre für Hilfe sehr dankbar!

MfG
mdo
 
Ich kann dir zwar keine Antwort geben, aber wofür den Service? Alles was dein Service machen kann, kann dein Prozess doch auch selber machen (falls gleiche Rechte etc. vorliegen).
 
Ja, in dem ersten Post habe ich den Service weggelassen um das Problem nicht zu kompliziert zu gestalten.
Aber um den Ablauf genau zu beschreiben:

Ein Service wird automatisch gestartet. Beim Start, startet dieser Service das Javaprogramm. Das muss so sein, damit das Javaprogramm gestartet wird, obwohl sich noch kein Benutzer angemeldet hat. Und es wird auch nicht beendet, wenn sich ein Benutzer abmeldet. Es läuft quasi immer, solange man den Rechner nicht ausmacht oder den Prozess des Javaprogramms beendet (von Hand, oder durch die OnStop() Methode des Services)

Jetzt will ich eine GUI bauen, um das Javaprogramm zu starten und zu beenden. Dazu starte ich aus der GUI heraus den Service und beende auch den Service. Der Service startet und beendet seinerseits das Javaprogramm. Das muss so sein, weil sonst nach Abmelden des Benutzers, der die GUI gestartet hat, das Javaprogramm beendet würde... Da das nicht gewollt ist, muss ich von der GUI aus den Service steuern. Kompliziert, aber es gibt keinen anderen Weg.

Jedenfalls funktioniert das alles schon wunderbar. Allerdings wird beim Beenden des Javaprogramms durch den Service, das Javaprogramm einfach nur "gekillt", ohne dass es eine Möglichkeit hat, auf seine offenen Threads zu warten. Und genau hier muss etwas getan werden. Und aus diesem Grund brauche ich die Kommunikation von GUI zu Service (beides C#) und dann von Service zu Javaprogramm.
 
Um Services zu steuern gibt es die ServiceController-Componente.
Mit der ServiceName-Eigenschaft kannst du festlegen, welchen Service du steuern möchtest. Mit der ExecuteCommand-Methode kannst du mit dem Service kommunizieren (habe das nur aus der MSDN; habe selber keine Erfahrung damit).
Bleibt aber immer noch das Problem das Java-Programm ordentlich zu beenden...
 
  • Gefällt mir
Reaktionen: mdo
Oha, vielen Dank für den Tip! Ich starte und beende mit der ServiceController-Componente den Service bereits, allerdings wusste ich nicht dass ich dem Service damit ein Command geben kann... Das werd ich morgen mal genau testen! Damit wäre das halbe Problem hoffentlich behoben...

Erstmal Danke soweit! Hoffe für das andere Problem fällt auch noch jemandem etwas nützliches ein.
 
Hallo!
Jo ich habs jetzt ganz anders gelöst...
Da das Javaprogramm sowohl Linux als auch Windowsfähig sein soll und so oder so auf 3 Ports ständig am lauschen ist, hab ich es mit Portkommunikation gelöst.
Ich sende dem Server über nen Port zB ein #CLOSE und er beendet sich :)

Aber danke für deine Mühe :)
 

Neue Beiträge

Zurück