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

1 Solution

Accepted Solutions
Anonymous
Not applicable

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

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

Hallo Nils,

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

Gruß,

Sebastian

0 Kudos

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

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 ?

Hallo Andre,

genau das ist der empfohlene Weg.

Gruß und Danke,

Daniel

0 Kudos