Erreur lors d'exports

Bonjour,

J’ai une erreur lors de la tentative d’export d’un objet. Hier je ne parvenais pas à exporter un module. Lors du clic sur “export XML” depuis le menu du module, une modale d’erreur s’affichait sans message d’erreur, et rien dans les logs simplicité ni dans les logs tomcat.

J’ai retenté ce matin, et maintenant la modale d’erreur m’indique une erreur 405 avec dans les logs, suivi d’un plantage de l’instance, avec dans les logs tomcat :

17-Jul-2020 12:12:29.610 GRAVE [http-nio-10588-exec-6] org.apache.catalina.core.StandardWrapperValve.invoke "Servlet.service()" pour la servlet [JSONUI] a généré une exception
	java.lang.IllegalStateException: La terminaison distante est dans l'état [TEXT_FULL_WRITING] ce qui est invalide pour la méthode appelée
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1234)
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1196)
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:190)
		at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
		at com.simplicite.webapp.websockets.Events.pushLog(Events.java:165)
		at com.simplicite.util.AppLog.warning(AppLog.java:512)
		at com.simplicite.util.AppLog.log(AppLog.java:234)
		at com.simplicite.util.AppLog.log(AppLog.java:192)
		at com.simplicite.util.AppLog.warning(AppLog.java:500)
		at com.simplicite.webapp.servlets.AbstractJSONServlet.service(AbstractJSONServlet.java:102)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:77)
		at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at com.simplicite.webapp.filters.AuthMethodFilter.doFilter(AuthMethodFilter.java:137)
		at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188)
		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
		at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:191)
		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
		at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.base/java.lang.Thread.run(Thread.java:834)

Et en essayant d’exporter un simple objet métier

17-Jul-2020 11:53:49.381 GRAVE [http-nio-10588-exec-9] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose Echec lors de l'appel de la méthode onClose du point de terminaison POJO de type [com.simplicite.webapp.websockets.ui.Events]
	java.lang.reflect.InvocationTargetException
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
		at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
		at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
		at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:354)
		at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:296)
		at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
		at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
		at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
		at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
		at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
		at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.base/java.lang.Thread.run(Thread.java:834)
	Caused by: java.lang.IllegalStateException: Le message ne sera pas envoyé parce que la session WebSocket a été fermée
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:430)
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309)
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250)
		at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191)
		at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
		at com.simplicite.webapp.websockets.Events.pushLog(Events.java:165)
		at com.simplicite.util.AppLog.debug(AppLog.java:426)
		at com.simplicite.util.AppLog.log(AppLog.java:239)
		at com.simplicite.util.AppLog.log(AppLog.java:192)
		at com.simplicite.util.AppLog.log(AppLog.java:349)
		at com.simplicite.webapp.websockets.AbstractWebsocket.log(AbstractWebsocket.java:294)
		at com.simplicite.webapp.websockets.AbstractWebsocket.onClose(AbstractWebsocket.java:107)
		at com.simplicite.webapp.websockets.AbstractWebsocket.onCloseHandler(AbstractWebsocket.java:265)
		at com.simplicite.webapp.websockets.ui.Events.onCloseHandler(Events.java:62)
		... 23 more

Nous sommes en :

Simplicité version4.0 patch level P24Built on2020-07-16 19:40 (revision ee89b080e219c314646ed33fd32176e343134ee5)Database levelP24;0e0999a29ee539ebb6b0e22fb7b4a171

C’est semble-t-il uniquement sur ce module. Auriez-vous une piste de résolution ?

Merci d’avance,

Guillaume

Le code HTTP 405 n’est pas généré applicativement par Simplicité.

Je pense que c’est plutôt l’infrastructure (Tomcat, un revesre proxy, …) qui coupe un stream à un moment ou à un autre car le volume de données dépasse des limites définies.

Qu’est ce qui caractérise ce module ? Est-il très volumineux ?

L’archive de sauvegarde de l’appli fait 6Mo, ce qui ne me semble pas excessif (nous en avons de plus grosses). Nous avons 46 objets métiers par contre.

J’ai récupéré la sauvegarde sur l’espace disque et je l’ai redéployée sur une instance de tests, et le problème et identique à celui d’hier (modale d’erreur sans message) sur cette nouvelle instance

Je vois dans les logs de cette instance :

17-Jul-2020 14:09:40.934 GRAVE [http-nio-10218-exec-6] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() du Servlet [ExternalObject] dans le contexte au chemin [/recherche] a retourné une exception [L'exécution de la servlet a lancé une exception] avec la cause
	java.lang.StackOverflowError
		at java.base/java.util.IdentityHashMap.isEmpty(IdentityHashMap.java:288)
		at java.base/java.util.Collections$SetFromMap.<init>(Collections.java:5555)
		at java.base/java.util.Collections.newSetFromMap(Collections.java:5542)
		at java.base/java.lang.Throwable.printStackTrace(Throwable.java:664)
		at java.base/java.lang.Throwable.printStackTrace(Throwable.java:735)
		at org.apache.log4j.DefaultThrowableRenderer.render(DefaultThrowableRenderer.java:60)
		at org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:87)
		at org.apache.log4j.spi.LoggingEvent.getThrowableStrRep(LoggingEvent.java:413)
		at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:313)
		at org.apache.log4j.DailyRollingFileAppender.subAppend(DailyRollingFileAppender.java:369)
		at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
		at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
		at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
		at org.apache.log4j.Category.callAppenders(Category.java:206)
		at org.apache.log4j.Category.forcedLog(Category.java:391)
		at org.apache.log4j.Category.error(Category.java:322)
		at com.simplicite.util.AppLog.error(AppLog.java:553)
		at com.simplicite.util.AppLog.log(AppLog.java:232)
		at com.simplicite.util.AppLog.log(AppLog.java:192)
		at com.simplicite.util.AppLog.log(AppLog.java:349)
		at com.simplicite.util.engine.DBAccess.query(DBAccess.java:936)
		at com.simplicite.util.engine.DBAccess.query(DBAccess.java:680)
		at com.simplicite.util.engine.DBAccess.simpleQuery(DBAccess.java:1026)
		at com.simplicite.util.GrantDirect.simpleQuery(GrantDirect.java:100)
		at com.simplicite.util.Grant.simpleQuery(Grant.java:871)
		at com.simplicite.util.Grant.simpleQuery(Grant.java:837)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)
		at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)

mais également dans la foulée :

Exception in thread "SimpliciteCronThread" java.lang.IllegalStateException: La terminaison distante est dans l'état [TEXT_FULL_WRITING] ce qui est invalide pour la méthode appelée
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1234)
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1196)
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:190)
	at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
	at com.simplicite.webapp.websockets.Events.pushLog(Events.java:165)
	at com.simplicite.util.AppLog.error(AppLog.java:555)
	at com.simplicite.util.AppLog.log(AppLog.java:232)
	at com.simplicite.util.AppLog.log(AppLog.java:192)
	at com.simplicite.util.AppLog.error(AppLog.java:543)
	at com.simplicite.util.engine.CronManager$CronDaemon.run(CronManager.java:90)

Je pense que je vais exporter tous les objets du module (Objets métiers, templates, vues …) un à un pour recréer un module en “bon état”

N’y aurait il pas une boucle dans vos héritages d’objets ?

Je n’ai pas l’impression, aucun objet métier n’hérite d’un autre

Il est vrai que la ligne

at com.simplicite.util.engine.Interface.exportModuleParentObject(Interface.java:2715)

se reproduit un certain nombre de fois !

Il y a clairement un cycle dans votre modèle, pas forcement au niveau d’un héritage.
Dans un même module, quand on exporte un objet qui en référence un autre pas encore exporté, il est exporté en premier = pour que l’import se passe dans le bon ordre.

Vous êtes dans un cas qui boucle.

je reprend le sujet car Guillaume est absent et que le problème existe toujours.

comment trouver l’objet qui pose problème ?
le module est un module développé en V3, qui fonctionnait très bien et pour lequel nous sommes de cours de migration en V4

Bonjour,

L’algorithme d’export de module contient un garde fou pour ne pas boucler en cas de dépendances croisées, il doit y avoir une régression à ce niveau qui doit se produire dans des cas marginaux. On va regarder.

Le cycle dont on parle peut se trouver sur n’importe quel lien reflexif donc pas forcement sur un objet métier, ça peut donc être un Groupe avec un héritage de groupe en boucle.

On va essayer d’améliorer l’algo d’export pour alerter en cas de boucle dans les logs.

@Francois
merci pour ta réponse. on est vraiment bloqué pour déployer l’appli en recette et faire les tests.

Ok en créant un cycle entre héritage de groupe par exemple, on peut reproduire ce problème d’export.
On a renforcé le code pour afficher une erreur dans les logs et arrêter la boucle.
En attendant de vous mettre à jour, vous pouvez surement le retrouver :

  • Il n’y a pas beaucoup d’endroits usuels où c’est possible dans Simplicité de créer un cycle, à première vue : héritage de groupes et Domaine/Sous-domaine
  • ou alors cas plus tordu qui ne doit pas être contrôlé : un attribut date de fin qui pointe sur une date de début = lui-même…

On va donc également ajouter un contrôle bloquant lors de la création d’un cycle sur les Groupes et les Domaines. On ne peut peut déjà pas faire un cycle sur les héritages d’objet qui reste le cas classique d’erreur.

merci pour l’évolution. Le message d’erreur m’a permis de trouver l’attribut qui posait pb. effectivement, un attribut date qui pointait sur lui même.

ok parfait,
on va ajouter un contrôle bloquant sur ce cas également.