cancel
Showing results for 
Search instead for 
Did you mean: 

Problème d'accès à un javascrit depuis une action planifiée

stef44
Champ in-the-making
Champ in-the-making
Bonjour et bonne année à tous,

J'essaie de lancer un javascript de manière planifiée. J'ai donc créé un webscript que je peux lancer manuellement avec le résultat attendu.

J'ai poursuivi en regardant le wiki (http://wiki.alfresco.com/wiki/Scheduled_Actions).
L'action se déclenche bien toutes les minutes (confirmé par les logs) mais j'ai rencontré le même message d'erreur que dans ce message : https://forums.alfresco.com/fr/viewtopic.php?f=25&t=2846#p13029
11:33:00,020 User:System ERROR [quartz.core.JobRunShell] Job jobGroup.jobD threw an unhandled Exception: 
java.lang.NullPointerException
   at org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition.getNodes(CronScheduledQueryBasedTemplateActionDefinition.java:223)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition$1.doWork(AbstractScheduledAction.java:397)
   at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:508)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition.execute(AbstractScheduledAction.java:392)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
11:33:00,020 User:System ERROR [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:227)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: java.lang.NullPointerException
   at org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition.getNodes(CronScheduledQueryBasedTemplateActionDefinition.java:223)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition$1.doWork(AbstractScheduledAction.java:397)
   at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:508)
   at org.alfresco.repo.action.scheduled.AbstractScheduledAction$JobDefinition.execute(AbstractScheduledAction.java:392)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
   … 1 more

Voici le contenu du fichier Alfresco\tomcat\shared\classes\alfresco\extension\scheduled-action-services-context.xml :
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
    <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>
                    <!– Note that as of Alfresco 4.0, due to a  Spring upgrade, the FreeMarker ${foo} entries must be escaped –>
                    <value>\$\{selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:webscripts/app:org/app:examples/cm:maxversion.get.js"' )\}</value>
                </entry>
            </map>
        </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/1 * * * ?</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="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></beans>

Et le fichier javascript 'maxversion.get.js' se trouve dans le référentiel à cet endroit : /Espace racine/Dictionnaire de données/Scripts Web/org/example

J'ai fait de nombreux essais sur la syntaxe de la recherche Lucene (car je pense que le problème est là) mais j'avoue ne plus savoir quoi tenter pour résoudre mon problème.

J'espère que quelqu'un y verra plus clair que moi dans mon code.

Merci

Stéphane

PS : Version Alfresco 3.4d community sous Windows XP
15 REPLIES 15

cleseach
Star Contributor
Star Contributor
Bonjour Stéphane,

Vous utilisez la version 3.4.d et pourtant, dans votre XML on peut lire :
<!– Note that as of Alfresco 4.0, due to a  Spring upgrade, the FreeMarker ${foo} entries must be escaped –>
Pas la peine d'échaper ${} en version 3.4.d.

Par ailleurs, il ne me semble pas avoir vu la définition suivante dans les propriétés du bean runScript ;
<property name="templateActionModelFactory">
  <ref bean="templateActionModelFactory"/>
</property>

Corrigez ces deux points, ça devrait aller un peu mieux.
Après il faudra probablement revoir cette partie là
<property name="queryTemplate">
  <value>PATH:"/app:company_home"</value>
</property>
… mais nous n'y sommes pas encore 😉

Cordialement,
Charles Le Seac'h

stef44
Champ in-the-making
Champ in-the-making
Bonjour et merci pour cette prompte réponse,

Concernant le commentaire sur la 4.0, c'est tiré d'un exemple de code où j'ai laissé ce commentaire inutile.

Pour le bean templateActionModelFactory, j'ai trouvé entre-temps sa déclaration. Auparavant, j'avais uniquement la référence sans la déclaration. J'avais donc des erreurs sur ce point. C'est désormais corrigé.

En l'état, je n'ai plus d'erreur dans la log mais je n'ai plus de trace d'exécution non plus. Je vais donc investiguer sur vos autres remarques.

Cordialement

Stéphane

cleseach
Star Contributor
Star Contributor
Concernant le commentaire sur la 4.0, c'est tiré d'un exemple de code où j'ai laissé ce commentaire inutile.
Vous n'avez pas fait que laisser ce commentaire, vous avez également suivi ses indications. En effet, vous avez écrit :
<value>\$\{selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:webscripts/app:org/app:examples/cm:maxversion.get.js"' )\}</value>
qui est la façon de faire en 4.0, au lieu de :
<value>${selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:webscripts/app:org/app:examples/cm:maxversion.get.js"' )}</value>
qui est la façon de faire en 3.4. En 3.4 "$", "{" et "}" sont écrits "$", "{" et "}"  et pas "\$", "\{" et "\}".

Cordialement,
Charles Le Seac'h

stef44
Champ in-the-making
Champ in-the-making
Bonjour,

Après il faudra probablement revoir cette partie là
<property name="queryTemplate">
  <value>PATH:"/app:company_home"</value>
</property>
… mais nous n'y sommes pas encore 😉

Cordialement,
Charles Le Seac'h

Je crois que j'y suis arrivé :
14:55:00,025  ERROR [quartz.core.ErrorLogger] Job (jobGroup.jobD threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: org.alfresco.error.AlfrescoRuntimeException: 00030050 Invalid store ref: Does not contain ://   //SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:webscripts/app:org/app:examples]
   at org.quartz.core.JobRunShell.run(JobRunShell.java:227)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: org.alfresco.error.AlfrescoRuntimeException: 00030050 Invalid store ref: Does not contain ://   //SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:webscripts/app:org/app:examples

C'est d'ailleurs un message déjà reporté ici : https://forums.alfresco.com/fr/viewtopic.php?f=25&t=5122 avec un bug remonté chez Alfresco https://issues.alfresco.com/jira/browse/ALF-9981.

Ce qui me dérange dans les problèmes que je rencontre est que j'ai suivi le wiki (http://wiki.alfresco.com/wiki/Scheduled_Actions#Script_Action_Example) qui est donc orienté Alfresco 4.0 et que le code que j'ai utilisé correspond à ce qu'on peut trouver sur des blogs (http://aboutalfresco.blogspot.com/2010/01/scheduled-actions-in-alfresco.html) sans précision de version.

Cela est assez déroutant pour un débutant comme moi.

Stéphane

cleseach
Star Contributor
Star Contributor
Bonjour,

J'ai essayé de reproduire votre problème sur 3.4.d et 3.4.e avec Tomcat 6.0.29 (bien) et 6.0.33 (pas bien) sans y parvenir.
La différence principale : je suis sous Windows 7.

"Chez moi ça marche !" 😞

Cordialement,
Charles Le Seac'h

stef44
Champ in-the-making
Champ in-the-making
Bonjour,

3.4.d et 3.4.e avec Tomcat 6.0.29 (bien) et 6.0.33 (pas bien) sans y parvenir.

Autre différence, la version (Community - v3.4.0 (d 3370)) que j'utilise est fournie avec Tomcat 6.0.26  :evil:

Stéphane

stef44
Champ in-the-making
Champ in-the-making
Bonjour,

Voici quelques compléments à mon problème.

Si j'échappe la ligne
<value>\$\{selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/cm:webscripts/cm:org/cm:example/cm:maxversion.get.js"' )\}</value>
comme conseillé dans le bug https://issues.alfresco.com/jira/browse/ALF-9981, je n'ai plus d'erreur mais le script ne se lance pas.

Si je n'échappe pas cette ligne, le script se lance mais j'ai le message
"Invalid store ref:" Does not contain …

D'après les forums, ce sont les deux impasses à ce problème. Cela me surprend un peu qu'on ne puisse pas planifier l'exécution de scripts dans Alfresco 3.4.

Stef44

cleseach
Star Contributor
Star Contributor
Bonjour,

Je viens de faire un test avec l'installeur fourni par Alfresco et j'arrive bien à reproduire votre problème si je fais une installation complète.
En revanche, lorsque je n'installe aucun module complémentaire, le fonctionnement semble correcte (sans les \ dans le fichier -context.xml).

Je vous laisse pousser les tests plus loin pour identifier le module entraînant le problème.

Cordialement,
Charles Le Seac'h

cleseach
Star Contributor
Star Contributor
Bonjour,

Une autre astuce à tester :
<value>#{"${"}selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/cm:webscripts/cm:org/cm:example/cm:maxversion.get.js"' )#{"}"}</value>

Les marqueurs Freemarkers (${ et }) sont alors générés par SPRING SPEL et l'expression qui est injectée dans SimpleTemplateActionDefinition est bien ${selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/cm:webscripts/cmSmiley Surprisedrg/cm:example/cm:maxversion.get.js"' )}.
Dites-moi si ça marche mieux de la sorte.

Cordialement,
Charles Le Seac'h
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.