[Résolu] Scheduler, cron et javascript

cancel
Showing results for 
Search instead for 
Did you mean: 
nejisama8
Member II

[Résolu] Scheduler, cron et javascript

Bonjour,

Voila j'essaye de mettre en place l'exécution périodique d'un javascript. Je me suis donc renseigné sur le wiki d'Alfresco à cette adresse :
http://wiki.alfresco.com/wiki/Scheduled_Actions pour le scheduler.
Je me suis servis de l'exemple suivant afin de mettre en place cron (destination et nom :alfresco\extension\scheduled-action-services-context.xml) et l'appel de mon fichier testscript:
<!–
    Execute the script /Company Home/Record Management/testscript.js
    –>
    <bean id="runScriptAction" class="org.alfresco.repo.action.scheduled.SimpleTemplateActionDefinition">
        <property name="actionName">
            <value>script</value>
        </property>
        <property name="parameterTemplates">
            <map>
                <entry>
                    <key>
                        <value>script-ref</value>
                    </key>
                    <value>${selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/cm:Record_x0020_Management/cm:testscript.js"' )}</value>
                </entry>
            </map>
        </property>
        <property name="templateActionModelFactory">
            <ref bean="templateActionModelFactory"/>
        </property>
        <property name="dictionaryService">
            <ref bean="DictionaryService"/>
        </property>
        <property name="actionService">
            <ref bean="ActionService"/>
        </property>
        <property name="templateService">
            <ref bean="TemplateService"/>
        </property>
    </bean>
   
    <!–
   Run the script every minute - select the single node company home that is not used …
    –>
    <bean id="runScript" class="org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition">
        <property name="transactionMode">
            <value>UNTIL_FIRST_FAILURE</value>
        </property>
        <property name="compensatingActionMode">
            <value>IGNORE</value>
        </property>
        <property name="searchService">
            <ref bean="SearchService"/>
        </property>
        <property name="templateService">
            <ref bean="TemplateService"/>
        </property>
        <property name="queryLanguage">
            <value>lucene</value>
        </property>
        <property name="stores">
            <list>
                <value>workspace://SpacesStore</value>
            </list>
        </property>
        <property name="queryTemplate">
            <value>PATH:"/app:company_home"</value>
        </property>
        <property name="cronExpression">
            <value>0 0/10 * * * ?</value>
        </property>
        <property name="jobName">
            <value>jobD</value>
        </property>
        <property name="jobGroup">
            <value>jobGroup</value>
        </property>
        <property name="triggerName">
            <value>triggerD</value>
        </property>
        <property name="triggerGroup">
            <value>triggerGroup</value>
        </property>
        <property name="scheduler">
            <ref bean="schedulerFactory"/>
        </property>
        <property name="actionService">
            <ref bean="ActionService"/>
        </property>
        <property name="templateActionModelFactory">
            <ref bean="templateActionModelFactory"/>
        </property>
        <property name="templateActionDefinition">
            <ref bean="runScriptAction"/> <!– This is name of the action (bean) that gets run –>
        </property>
        <property name="transactionService">
            <ref bean="TransactionService"/>
        </property>
        <property name="runAsUser">
            <value>System</value>
        </property>
    </bean>

Cependant bien qu'ayant créé un fichier testscript.js dans le répertoire des scripts de Data Dictionnary. Lorsque je relance mon serveur tomcat, une erreur apparait  et la page de login ne se lance pas.
J'ai donc regardé dans le fichier alfresco.log,
11:56:50,258 ERROR [org.springframework.web.context.ContextLoader] Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath*:alfresco/extension/*-context.xml]
Offending resource: class path resource [alfresco/application-context.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 4 in XML document from file [/opt/Alfresco/tomcat/shared/classes/alfresco/extension/scheduled-action-services-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'bean'.
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 4 in XML document from file [/opt/Alfresco/tomcat/shared/classes/alfresco/extension/scheduled-action-services-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'bean'.
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'bean'.
   at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
   at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
   at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
   at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
   at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
   at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
   at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
   at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
   at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
   at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
   at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
   at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
   at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
   at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
   at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
   at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:351)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:280)
   at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:131)
   at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:147)
   at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:171)
   at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:145)
   at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:130)
   at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:90)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:458)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:353)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:280)
   at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:131)
   at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:147)
   at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
   at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
   at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:101)
   at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:389)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:324)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:244)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:187)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
   at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:830)
   at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:719)
   at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
   at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
   at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
   at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
   at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
   at org.apache.catalina.core.StandardService.start(StandardService.java:516)
   at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
   at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
   at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
11:57:16,992 INFO  [org.alfresco.web.site.FrameworkHelper] Successfully Initialized Web Framework

Il apparaissait que le fichier scheduled-action-services-context.xml avait une erreur. J'ai supprimé le fichier et le serveur a put correctement se redémarrer.

Le fichier javascript ne contient qu'une instruction createSite() (juste pour vérifier l'appel du fichier et l'interaction avec alfresco ).

config :
OS : Ubuntu 8.10
alfresco 3labs
mysql

Après l'explication voici les questions :
1) le fichier scheduled-action-services-context.xml est -il au bon endroit? Si non ou le mettre?
2) le code fournit dans le wiki a-t-il un problème
3) Le problème est-il engendré par mon fichier js(bien que cela me surprendrait vraiment vu que le fichier de log parle du fichier du scheduler).

Voila merci de vos réponses et conseils.  Smiley Very Happy
6 Replies
cleseach
Active Member II

Re: [Résolu] Scheduler, cron et javascript

Bonjour,

Votre problème provient de la structure de votre fichier xml.
En effet, les fichiers -context.xml doivent commencer par les lignes suivantes :
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
(il ne faut pas non plus oublier de terminer le fichier par </bean>)

Avec ça, vous devriez franchir une première étape.

Vous rencontrerez ensuite certainement un problème avec votre script. Vous nous indiquez en effet que celui-ci est stocké dans l'espace Company Home/Data Dictionary/Scripts, mais votre configuration indique que le script doit être recherché dans l'espace Company Home/Record Management :
'PATH:"/app:company_home/cm:Record_x0020_Management/cm:testscript.js"'

Si votre script est vraiment dans Company Home/Data Dictionary/Scripts, vous devriez utiliser ce chemin :
'PATH:"/app:company_home/app:dictionary/app:scripts/cm:testscript.js"'

Cordialement,
Charles Le Seac'h
nejisama8
Member II

Re: [Résolu] Scheduler, cron et javascript

Bonjour,

voila je viens de modifier le fichier du scheduler, comme vous me l'avez conseiller, mais j'ai dut l'enlever :
      

</property>
        <property name="templateActionModelFactory">
            <ref bean="templateActionModelFactory"/>
        </property>

mais maintenant cela fonctionne ou du moins le serveur parviens à se lancer.
Maintenant reste le problème du javascript.
Pour faire plus simple j'ai essayé de mettre comme seul ligne de commande du fichier de script :
window.open("http://www.google.fr/");

Qui m'ouvrira un une nouvelle page web, ce qui me permettrai de vérifier l'exécution du js.
Cependant un problème survient lors du lancement de l'execution periodique du ficheir scheduled-action-services-context.xml

11:10:00,024 ERROR [org.quartz.core.JobRunShell] Job jobGroup.jobD threw an unhandled Exception: 
java.lang.NullPointerException
   at org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition.getNodes(CronScheduledQueryBasedTemplateActionDefinition.java:229)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition$1.doWork(AbstractScheduledAction.java:403)
   at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:437)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition.execute(AbstractScheduledAction.java:398)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
11:10:00,028 ERROR [org.quartz.core.ErrorLogger] Job (jobGroup.jobD threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException]
   at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
Caused by: java.lang.NullPointerException
   at org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition.getNodes(CronScheduledQueryBasedTemplateActionDefinition.java:229)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition$1.doWork(AbstractScheduledAction.java:403)
   at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:437)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition.execute(AbstractScheduledAction.java:398)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
   … 1 more

J'ai donc enlever le JobGroup mais  de nouveau une erreur survient cette fois-ci lancé par DEFAULT.JobD.

Quels peuvent être les raisons et comment définir le job afin d'éviter d'avoir le NullPointerException?

Ps: Tant que je suis dans les questions de bas niveau, qu'est-ce qu'un job dans les propriétés du scheduled-action, car le lien wiki ne l'explique pas (http://wiki.alfresco.com/wiki/Scheduled_Actions)
merci beaucoup de votre réponse précédente qui m'a permis de progresser Smiley Happy
cleseach
Active Member II

Re: [Résolu] Scheduler, cron et javascript

Bonjour,

Pouvez-vous nous expliquer ce qui vous a conduit à retirer la propriété "templateActionModelFactory" ? (et sur quel bean vous l'avez retirée).
Si des propriétés ont été définies, c'est en générale qu'elles servent à quelque chose Smiley Wink
Il est fort probable que le "NullPointerException" que vous observez soit lié à cette suppression.

Au passage, n'oubliez pas que votre script est un script côté serveur, pas côté client web. Un window.open ne vous sera donc d'aucune utilité et il est très vraissemblable que l'objet window ne soit pas connu. Pour vous assurer que le script a bien tourné, le mieux est de produire un fichier de log.

Cordialement,
Charles Le Seac'h
nejisama8
Member II

Re: [Résolu] Scheduler, cron et javascript

Bonjour,

Effectivement cette option n'était pas à supprimer, je l'ai donc remise, j'ai aussi rajouté le bean templateActionModelFactory, que j'avais oublié au préalable. Cette erreur est donc corigé.

Je suis actuellement en train de réinstallé un serveur sur lequel je vais mettre un alfresco dessus, pour pouvoir faire mes tests tranquillou dans mon bureau. Je doit donc suspendre mes tests pour l'instant mais sinon effectivement le window.open était la commande la plus simple pour moi pour verifier l'éxécution périodique du javascript, car quand j'ai essayé d'écrire dans un fichier avec activeX j'ai eut des soucis de securité j'ai donc opter pour le window.open.

Y-a-t-il une autre méthode pour ecrire dans les fichiers de log( sortie standard par exemple) me permettant d'eviter le window.open.

Merci encore pour votre suivi de mon post.
cleseach
Active Member II

Re: [Résolu] Scheduler, cron et javascript

Bonjour,

J'ai beaucoup de mal à voir la logique de :
écrire dans un fichier avec activeX j'ai eut des soucis de securité j'ai donc opter pour le window.open

Le code JavaScript que vous pouvez écrire s'exécute côté serveur, pas côté navigateur. Ceci signifie que ActiveX (qui n'est pas du JavaScript) ou interactions utilisateurs (window.open, alert, etc.) ne sont pas disponibles.

Pour produire des traces permettant le suivi de l'exécution de votre code, vous pouvez utiliser la méthode décrite dans le wiki : http://wiki.alfresco.com/wiki/3.0_JavaScript_API#Logging_API

Cordialement,
Charles Le Seac'h
nejisama8
Member II

Re: [Résolu] Scheduler, cron et javascript

Merci beaucoup votre réponse a permis de résoudre mon problème.

Bonne continuation