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

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

Merci pour l'astuce. Toutefois cela ne fonctionne pas avec ce que j'ai installé.

Est-ce que cette portion de code est correcte ?
        <property name="queryTemplate">
            <value>PATH:"/app:company_home"</value>
        </property>

Je vais réinstaller une version minimale d'alfresco (juste avec Share).

Stéphanae

cleseach
Star Contributor
Star Contributor
Bonjour,

Qu'est ce qui ne fonctionne pas ?
Le script est-il bien exécuté et les résultats ne sont pas ceux attendus ? N'y a-t-il pas de résultats ? Quel est le code JS que vous appelez ?

Concernant le "queryTemplate", il ne va remonter que la racine du référentiel… pas sûr que ce soit vraiment ce que vous souhaitez.

Cordialement,
Charles Le Seac'h

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

Dans les logs, je ne vois aucune trace de l'exécution toutes les minutes (intervalle réduit pour des raisons de test) du script. Alors que lorsqu'il y a une erreur (comme les précédentes), je vois bien une éxécution toutes les minutes. Je ne vois pas non plus le résultat de son exécution qui est la suppression de l'historique des versions de tous les documents. Cette suppression est faite par l'appel au js suivant :
var docs = search.luceneSearch("@cm\\:created:[MIN TO NOW]");
   for (var i=0; i<docs.length; i++)
   {
       MaxVersions.setMaxVersion(docs[i].nodeRef,2);
   }

La classe Java existe et fonctionne correctement car j'ai testé l'ensemble en manuel avec le résultat attendu. C'est vraiment la planification du script qui me pose problème.

Vu que la requête lucène du js me ramène tous les documents du référentiel, je ne pense pas que le queryTemplate joue un grand rôle.

Stéphane

cleseach
Star Contributor
Star Contributor
Bonjour,

Il faudrait activer les logs sur, par exemple, l'ActionService et le SearchService pour vérifier que les appels ont bien lieu.
Vous pouvez également vérifier l'exécution de votre script en activant le debugger JavaScript.

Cordialement,
Charles Le Seac'h

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

Je vais explorer ces pistes car j'ai trouvé une solution de contournement qui est très couteuse.
J'ai créé une action dans la partie Scheduled Actions du dictionnaire de données avec comme code le code JS qui appelle ma classe. Cela fonctionne correctement. Toutefois je n'ai aucun paramétrage disponible sur l'action. Elle s'exécute donc en permanence :?

Stéphane

alfherv
Champ in-the-making
Champ in-the-making
Je me permets de relancer le débat.
Je travaille sur une version Entreprise 4.0.2.9 et je dois exécuter en tâche de fond un script de nettoyage des espaces persos.

J'ai réalisé le script et testé unitairement, il effectue ce que j'attends de lui.
Je souhaite en réaliser une tâche automatique, j'ai fait exactement comme précisé ci dessus, mais mon script ne s'execute pas depuis la tâche planifiée.

Je cherche à activer les logs pour vérifier s'il passe dans mon script mais je n'arrive pas à connaître les logs à activer.

ScriptAction ou autre ?

D'avance merci pour vos retours

Hervé
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.