novomind
I'm new here

ClassCastException im ConfigurationService bei Modulinstallation

Hallo,

wir haben jetzt dauerhaft ein großes Problem mit ClassCastExceptions mit dem ConfigurationService (ConfigurationServiceProxy cannot be casted to ConfigurationService) in einem bestimmten Modul. Diese sind durch ServiceRestart nicht abstellbar. Der Fehler tritt immer dann auf, sobald das Modul oder ein anderes Modul neuinstalliert wird, was während der Entwicklung sehr häufig passiert. Zur Behebung des Fehlers müssen wir den Server jedes Mal komplett neustarten und die Entwickler werden disconnectet, was auf Dauer natürlich kein tragbarer Zustand ist.

Uns ist dieses Verhalten durchaus bekannt. Diese Art der Fehler treten bei uns auch in anderen Modulen auf, konnten bis jetzt aber immer dadurch komplett behoben werden, indem einfach die Services der Module gestoppt und wieder neugestartet wurden, ohne jedoch den Server neustarten zu müssen. Dies wird im Admin Manual ja auch so empfohlen.

Der ConfigurationService des neuen Moduls ist nun der erste, der sich hartnäckig gegen die Behebung durch ServiceRestart weigert.

Server-Version: 5.1.106.61855

Aufruf des Service:

AdminDeploymentConfigurationServiceProxy proxy = (AdminDeploymentConfigurationServiceProxy) baseContext

          .requireSpecialist(ServicesBroker.TYPE).getService(AdminDeploymentConfigurationService.class);

Das ist die Exception:

java.lang.ClassCastException: Cannot cast com.nm.firstspirit.module.configuration.AdminDeploymentConfigurationServiceProxy to com.nm.firstspirit.module.configuration.AdminDeploymentConfigurationService

          at java.lang.Class.cast(Class.java:3005)

          at de.espirit.firstspirit.server.io.AbstractServiceLocator.getService(AbstractServiceLocator.java:96)

          at de.espirit.firstspirit.server.io.AbstractServerConnection.getService(AbstractServerConnection.java:553)

          at de.espirit.firstspirit.client.io.ProjectConnection.getService(ProjectConnection.java:116)

          at de.espirit.firstspirit.agency.ServicesBrokerImpl.getService(ServicesBrokerImpl.java:26)

          at com.nm.firstspirit.module.configuration.ConfigurationUtil.getConfigurationService(ConfigurationUtil.java:112)

          at com.nm.firstspirit.module.configuration.ConfigurationUtil.getConfigurationProperty(ConfigurationUtil.java:44)

          at com.nm.firstspirit.module.configuration.ConfigurationUtil.getMapListConfigurationProperty(ConfigurationUtil.java:78)

          at com.nm.firstspirit.module.adminoverviewpage.backend.configuration.AdminPageConfiguration.isTemplateTypeAllowed(AdminPageConfiguration.java:52)

          at com.nm.firstspirit.module.adminoverviewpage.backend.AOPFunctions.getTemplateTableGroups(AOPFunctions.java:72)

          at com.nm.firstspirit.module.adminoverviewpage.backend.AOPFunctions.getData(AOPFunctions.java:57)

          at AOPFunctions_getData_BaseContext_String_1804.invoke(Unknown Source)

          at de.espirit.firstspirit.parser.eval.Invoker$MethodWrapperImpl.invoke(Invoker.java:969)

          at de.espirit.firstspirit.parser.eval.Invoker.findRegisterAndInvokeMethod(Invoker.java:514)

          at de.espirit.firstspirit.parser.eval.Invoker.invokeMethod(Invoker.java:492)

          at de.espirit.firstspirit.parser.eval.Invoker.invokeMethod(Invoker.java:420)

          at de.espirit.firstspirit.parser.eval.Invoker.evalMethod(Invoker.java:214)

          at de.espirit.firstspirit.parser.EvaluatorImpl$2.invokeMethod(EvaluatorImpl.java:94)

          at de.espirit.firstspirit.parser.EvaluatorImpl.invokeMethod(EvaluatorImpl.java:211)

          at de.espirit.firstspirit.parser.impl.MethodImpl.eval(MethodImpl.java:94)

          at de.espirit.firstspirit.parser.impl.DottedExpression.eval(DottedExpression.java:72)

          at de.espirit.firstspirit.parser.impl.CmsSetImpl.print(CmsSetImpl.java:116)

          at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:532)

          at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

          at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

          at de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$NodeContext.render(NavigationFunctionImpl.java:784)

          at de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$StandardNavigation.print(NavigationFunctionImpl.java:986)

          at de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$StandardNavigation.renderFolders(NavigationFunctionImpl.java:1114)

          at de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$StandardNavigation.print(NavigationFunctionImpl.java:1029)

          at de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$StandardNavigation.print(NavigationFunctionImpl.java:973)

          at de.espirit.firstspirit.parser.eval.PrintableEnhancer.print(PrintableEnhancer.java:25)

          at PrintableEnhancer_print_Printable_145.invoke(Unknown Source)

          at de.espirit.firstspirit.parser.eval.Invoker$MethodWrapperImpl.invoke(Invoker.java:969)

          at de.espirit.firstspirit.parser.eval.Invoker.invokeMethod(Invoker.java:488)

          at de.espirit.firstspirit.parser.eval.Invoker.invokeMethod(Invoker.java:420)

          at de.espirit.firstspirit.parser.eval.Invoker.evalMethod(Invoker.java:214)

          at de.espirit.firstspirit.parser.EvaluatorImpl$2.invokeMethod(EvaluatorImpl.java:94)

          at de.espirit.firstspirit.parser.EvaluatorImpl.invokeMethod(EvaluatorImpl.java:211)

          at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:232)

          at de.espirit.firstspirit.parser.impl.CmsValueImpl.print(CmsValueImpl.java:69)

          at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:532)

          at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

          at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

          at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:532)

          at de.espirit.firstspirit.generate.PreviewProduction._calculate(PreviewProduction.java:206)

          at de.espirit.firstspirit.generate.PreviewProduction.calculate(PreviewProduction.java:103)

          at de.espirit.firstspirit.generate.AbstractPreviewManager.getPreview(AbstractPreviewManager.java:110)

          at de.espirit.firstspirit.io.servlet.PreviewServlet.deliverPreview(PreviewServlet.java:490)

          at de.espirit.firstspirit.io.servlet.PreviewServlet.doPost(PreviewServlet.java:274)

          at de.espirit.firstspirit.io.servlet.PreviewServlet.doGet(PreviewServlet.java:228)

          at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)

          at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)

          at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)

          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1367)

          at de.espirit.firstspirit.io.servlet.WebAuthentication.doChain(WebAuthentication.java:667)

          at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:530)

          at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:157)

          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1338)

          at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484)

          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)

          at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)

          at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)

          at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)

          at de.espirit.firstspirit.server.jetty.JettyManagerImpl$FailSafeWebAppContext.doHandle(JettyManagerImpl.java:839)

          at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)

          at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)

          at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)

          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)

          at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)

          at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)

          at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)

          at org.eclipse.jetty.server.Server.handle(Server.java:350)

          at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)

          at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)

          at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)

          at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)

          at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)

          at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)

          at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)

          at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)

          at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)

          at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)

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

Unser ServiceProxy sieht so aus.

public class AdminDeploymentConfigurationServiceProxy implements AdminDeploymentConfigurationService,

    ServiceProxy<AdminDeploymentConfigurationService> {

  AdminDeploymentConfigurationService service;

  public AdminDeploymentConfigurationServiceProxy() {

  }

  @Override

  public void init(AdminDeploymentConfigurationService service, Connection connection) {

    this.service = service;

  }

  @Override

  public Properties getConfiguration() {

    return service.getConfiguration();

  }

  @Override

  public void setConfiguration(Properties configuration) {

    service.setConfiguration(configuration);

  }

Unser Service sieht so aus:

public interface AdminDeploymentConfigurationService {

  Properties getConfiguration();

  void setConfiguration(Properties configuration);

}

Teile der Impl:

public class AdminDeploymentConfigurationServiceImpl implements AdminDeploymentConfigurationService,

    Service<AdminDeploymentConfigurationService> {

private boolean running;

public AdminDeploymentConfigurationServiceImpl() {

  }

  @Override

  public void init(ServiceDescriptor descriptor, ServerEnvironment serverEnvironment) {

    this.serverEnvironment = serverEnvironment;

  }

  @Override

  public Class<? extends ServiceProxy<AdminDeploymentConfigurationService>> getProxyClass() {

    return AdminDeploymentConfigurationServiceProxy.class;

  }

  @Override

  public Class<? extends AdminDeploymentConfigurationService> getServiceInterface() {

    return AdminDeploymentConfigurationService.class;

  }

  @Override

  public boolean isRunning() {

    return running;

  }

  @Override

  public void start() {

    loadConfiguration();

    running = true;

    LogUtils.logInfo(getClass(), "AdminDeploymentConfigurationService has been started.");

  }

  @Override

  public void stop() {

    running = false;

    LogUtils.logInfo(getClass(), "AdminDeploymentConfigurationService has been stopped.");

  }

Wir haben bereits einen kompletten Diff zwischen einem funktionsfähigen ConfigurationService eines anderen Moduls durchgeführt und haben unserer Meinung nach an alles gedacht.

Wir bitten um Hilfe. Vielleicht hat ja schon jemand Erfahrung mit diesem Problem?

Viele Grüße aus Hamburg,

Ronny.

0 Kudos
1 Reply
MichaelaReydt
Community Manager

Hallo Ronny,

wie du schon schreibst und auch in der von dir bereits erwähnten Admin-Dokumentation beschrieben ist, ist es in einigen Fällen notwendig, den FS-Server nach einer Modul-Installation neuzustarten. Das ist von uns leider nicht vermeidbar.

Basierend auf dem von dir geposteten Sourcecode liegt die Notwendigkeit des Neustarts vermutlich am ServiceProxy. Benötigt ihr den ServiceProxy auf jeden Fall? Ohne ihn könntet ihr den Neustart des Servers eventuell umgehen. Auch eine Aktualisierung des Servers könnte unter Umständen eine Verbesserung bringen. Bei beidem handelt es sich aber nur um eine Vermutung.

Viele Grüße

Michaela

0 Kudos