switt
I'm new here

Steuerung eines Service über die API

Jump to solution

Hallo,

ist es möglich einen Service über die API zu stoppen/ starten? Hintergrund ist, dass der UXBService sich gerne mal mit einer Exception verabschiedet (vorallem wenn dieser lange nicht aktiviert wurde) und ich diesen in so einem Fall gerne automatisiert neustarten lassen würde.

ERROR 30.01.2014 08:28:33.536 (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : java.lang.ClassCastException: com.sun.proxy.$Proxy67 cannot be cast to com.espirit.moddev.uxbridge.api.v1.service.UxbService

java.lang.ClassCastException: com.sun.proxy.$Proxy67 cannot be cast to com.espirit.moddev.uxbridge.api.v1.service.UxbService

    at com.espirit.moddev.uxbridge.inline.UxbInlineUtil.execute(UxbInlineUtil.java:60)

    at com.espirit.moddev.uxbridge.inline.UxbInlineUtil.execute(UxbInlineUtil.java:49)

    at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:97)

    at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:134)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2222)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2205)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:2128)

    at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:545)

    at java.util.concurrent.FutureTask.run(FutureTask.java:262)

    at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)

    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)

    at java.util.concurrent.FutureTask.run(FutureTask.java:262)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:744)

    at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:37)

Grüße,
Sebastian

Labels (1)
1 Solution

Accepted Solutions
Anonymous
Not applicable

Re: Steuerung eines Service über die API

Jump to solution

Hallo Sebastian,

das funktioniert, allerdings benötigst du dafür eine AdminConnection (also User "Admin", kein allgemeiner User der Gruppe "Administrators").

ServiceManager serviceManager = ((ManagerProvider) connection).getManager(ServiceManager.class);

if (serviceManager.isServiceRunning(serviceName)) {

    serviceManager.stopService(serviceName);

}

serviceManager.startService(serviceName);

Dieser Code liegt bei uns in einer eigenen Methode restartService(). Diese wird in einer for-Schleife aufgerufen und rattert alle unsere Services durch.

for (final String service : services) {

    if (serviceManager.isAutostartEnabled(service)) {

        restartService(connection, service, logger);

    }

}

Viele Grüße,

Nils

View solution in original post

5 Replies
Anonymous
Not applicable

Re: Steuerung eines Service über die API

Jump to solution

Hallo Sebastian,

das funktioniert, allerdings benötigst du dafür eine AdminConnection (also User "Admin", kein allgemeiner User der Gruppe "Administrators").

ServiceManager serviceManager = ((ManagerProvider) connection).getManager(ServiceManager.class);

if (serviceManager.isServiceRunning(serviceName)) {

    serviceManager.stopService(serviceName);

}

serviceManager.startService(serviceName);

Dieser Code liegt bei uns in einer eigenen Methode restartService(). Diese wird in einer for-Schleife aufgerufen und rattert alle unsere Services durch.

for (final String service : services) {

    if (serviceManager.isAutostartEnabled(service)) {

        restartService(connection, service, logger);

    }

}

Viele Grüße,

Nils

switt
I'm new here

Re: Steuerung eines Service über die API

Jump to solution

Hallo Nils,

danke für die schnelle Antwort. Klappt wunderbar Smiley Happy

Gruß,

Sebastian

0 Kudos
witt
I'm new here

Re: Steuerung eines Service über die API

Jump to solution

Hallo zusammen,

bitte  berücksichtigt an dieser Stelle, dass ihr interne Klassen verwendet und hier insbesondere Manager die zukünftig nicht mehr erreichbar und nutzbar sind!

Daher ist der richtige Weg hier über den ServiceBroker zu gehen um sich den passenden Service zu holen, und diesen dann zu stoppen und zu starten.

Viele Grüße,

Daniel

0 Kudos
abiegel
New Creator

Re: Steuerung eines Service über die API

Jump to solution

private static final String UXB_SERVICE = "UXBService";

private static void restartService(Connection connection, String serviceName){

     final SpecialistsBroker broker = connection.getBroker();

     final ModuleAdminAgent moduleAdminAgent = broker.requireSpecialist(ModuleAdminAgent.TYPE);           moduleAdminAgent.stopService(serviceName);

      moduleAdminAgent.startService(serviceName);

}

Wär das Besser ?

witt
I'm new here

Re: Steuerung eines Service über die API

Jump to solution

Hallo Andre,

genau das ist der empfohlene Weg.

Gruß und Danke,

Daniel

0 Kudos