Wie installiere ich ActiveMQ Artemis als Windows-Dienst?

Wie installiere ich ActiveMQ Artemis als Windows-Dienst?

Der Titel ist etwas irreführend, da ich weiß, wie man Artemis als Windows-Dienst installiert. Laut der Dokumentation muss man nur ausführen

artemis-service.exe install

Das funktioniert bei mir nicht. Ich habe versucht, den Dienst mit ActiveMQ Artemis Version 2.31 und 2.29 zu installieren und auszuführen. Für beide Versionen erzeugt das Ausführen des Dienstes das folgende Protokollartemis-service.wrapper.log

2023-10-23 10:19:50,116 DEBUG - Starting WinSW in the service mode
2023-10-23 10:19:50,147 INFO  - Starting %JAVA_HOME%\bin\java.exe  -XX:+UseParallelGC -Xms512M -Xmx1024M -classpath "C:\Program Files (x86)\apache-artemis-2.31.0\lib\artemis-boot.jar" "-Dartemis.home=C:\Program Files (x86)\apache-artemis-2.31.0" -Dartemis.instance=C:\ArtemisBroker -Ddata.dir=C:\ArtemisBroker\data -Dartemis.instance.etc=C:\ArtemisBroker\etc -Djava.security.auth.login.config=C:\ArtemisBroker\etc\login.config -Dhawtio.disableProxy=true -Dhawtio.realm=activemq -Dhawtio.offline="true" -Dhawtio.role=amq -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal -Djolokia.policyLocation=file:/C:/ArtemisBroker/etc/jolokia-access.xml org.apache.activemq.artemis.boot.Artemis run 
2023-10-23 10:19:50,178 DEBUG - Completed. Exit code is 0

und die folgende Warnung wird angezeigt:

Bildbeschreibung hier eingeben

Die einzige Quelle, die einen Hinweis gibt, ist das Windows-Ereignisprotokoll mit folgendem Eintrag:

Bildbeschreibung hier eingeben

Service cannot be started. System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at winsw.Util.ProcessHelper.StartProcessAndCallbackForExit(Process processToStart, String executable, String arguments, Dictionary`2 envVars, String workingDirectory, Nullable`1 priority, ProcessCompletionCallback callback, Boolean redirectStdin, LogHandler logHandler, Boolean hideWindow)
   at winsw.WrapperService.StartProcess(Process processToStart, String arguments, String executable, LogHandler logHandler, Boolean redirectStdin)
   at winsw.WrapperService.OnStart(String[] args)
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

Ich habe alle Pfade im ausgeführten Befehl überprüft, aber alles scheint in Ordnung zu sein.

Das einzige was mir aufgefallen ist sind die Einträge

<startargument>-Djolokia.policyLocation=%ARTEMIS_INSTANCE_ETC_URI%/jolokia-access.xml</startargument>

Und

<env name="ARTEMIS_INSTANCE_ETC_URI" value="file:/C:/ArtemisBroker/etc/"/>

in artemis-service.xml, das dann aufgelöst wird zu

-Djolokia.policyLocation=file:/C:/ArtemisBroker/etc//jolokia-access.xml org.apache.activemq.artemis.boot.Artemis

Das scheint irgendwie falsch, aber eine Änderung (Entfernung eines /) ändert nichts.

Wie kann dieses Problem behoben werden?

Antwort1

Dank Gregs Kommentar konnte ich das Problem herausfinden. Mithilfe des Sysinternals-Prozessmonitors fand ich nach einigem Filtern die folgenden Einträge:

Bildbeschreibung hier eingeben

Dies bedeutet, dass der Dienststart die ausführbare Java-Datei zum Start nicht einmal finden konnte. Die Pfade zeigen, dass die Umgebungsvariable %JAVA_HOME%tatsächlich nicht gefunden werden kann (und das Programm durchsucht PATH, indem es die Unterpfadzeichenfolge einfügt).

Das hat mich überrascht, da ich mir ziemlich sicher war, die Variable gesetzt zu haben – mein Fehler war, dass ich sie als Benutzervariable und nicht als Systemvariable gesetzt habe. Anscheinend startet Windows den Dienst unter einem anderen Benutzer als dem, mit dem ich angemeldet bin, sodass die Variable nicht gefunden werden kann.

Das Festlegen %JAVA_HOME%als Systemumgebungsvariable hat dieses Problem behoben.

verwandte Informationen