Search the FirstSpirit Knowledge Base
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
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 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
Gruß,
Sebastian
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
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