Lundi, 6. Novembre 2006

PermaLinkUtiliser AJAX pour actionner vos Agents

Afin de mieux vous expliquer l’utilité d’Ajax pour appeler des agents via le web, prenons un cas concret :

Imaginez que vous disposez, sur l’une de vos applications, une page de type " tableau de bord ". Les différentes statistiques ne sont pas calculées à l’ouverture de la page mais prés calculées par un agent programmé toutes les heures. Ceci afin d’éviter de trop lourd calcul à chaque visualisation.

Jusque là tout va bien sauf que le gestionnaire de votre application à la bonne idée de vous demander un « bouton » sur cette page lui permettant de mettre à jours lui même ces statistiques.

Pour réaliser le souhait de votre utilisateur vous avez deux solutions.

  • La première solution (la mauvaise) consiste à appeler directement l’agent en question en lançant une url de type http://serveur/base.nsf/nomAgent?OpenAgent via un bouton par exemple :
    <input type="button" onclick="window.location.href=‘nomAgent?OpenAgent’”>

    Le premier problème c’est que le navigateur va rester figé durant l’exécution de l’agent car rien ne lui est renvoyé par le serveur avant la fin de tous ses traitements. De plus une fois le traitement réalisé on va se retrouver devant une belle page blanche avec un gros « Agent exécuté ».

  • La seconde solution (la bonne) c’est d’exécuter cet agent par une requête Ajax et recharger la page une fois l’agent exécuté. Cette solution a l’avantage de pouvoir montrer à l’utilisateur que l’agent est en cour d’exécution par un indicateur de ce type : .
    De plus on contrôle la fin d’exécution de l’agent et on peut ainsi choisir de recharger la page par exemple.

  • Voici comment mettre en place cette solution.

    Côté HTML on crée tout d’abord un bouton ainsi qu’un block div pour l’indicateur ajax :
    <input type="button" id="btUpdateStatistics" onclick="updateStatistics()" value="Mettre à jour statistiques"> <span id="Indicateur" style="display:none"><img src="Indicator.gif"></span>


    Voici le code côté Javascript à placer avant le bouton :
    // Création de l'handler ou l’on va gérer // l’apparition de l’indicateur d’activité // ainsi que l’activation/désactivation du bouton. var myGlobalHandlers = { onCreate: function(){ $('btUpdateStatistics').disabled = true; Element.show('Indicateur'); }, onComplete: function() { if(Ajax.activeRequestCount == 0){ $('btUpdateStatistics').disabled = false; Element.hide('Indicateur'); } } }; Ajax.Responders.register(myGlobalHandlers); var opt = { // Use POST method: 'get', // Handle successful response. Here we reload the current location onSuccess: function(t) { window.location.reload(); }, // Handle 404 on404: function(t) { alert('Error 404: location "' + t.statusText + '" was not found.'); }, // Handle other errors onFailure: function(t) { alert('Error ' + t.status + ' -- ' + t.statusText); } } function updateStatistics(){ if(Ajax.activeRequestCount == 0){ new Ajax.Request('nomAgent?OpenAgent', opt); } }
    Votre bouton sera donc désactivé pendant le traitement de l’agent et l’indicateur Ajax apparaîtra.



    Voici donc comment simplement faire appel à vos agents via le web sans créer d’agent spécifique.

    UPDATE :
    Comme vous l'aurez deviné, ne pas oublier d'insérer la bibliothèque Prototype.js à votre page.
     Commentairesv

    1. YoGi  07/11/2006 02:18:49


    Rho. Tu sais, tu peux rediriger l'utilisateur à l'issu du traitement de ton agent, pourquoi pas vers la page de consultation du tableau de bord (print "[/mabase.nsf/...]" à la fin).
    De même que ta page courante va rester affichée tant que la réponse du serveur ne sera pas arrivée. Ce qui te permet par exemple d'y faire appraître un indicateur qui n'existait pas avant :)


    2. julien  07/11/2006 07:26:11


    Oui effectivement mais pour cela il faut modifier ton agent schédulé pour insérer ton print. Ton admin va pas être super ravis d'avoir des logs à la noix lors de l'exécution par programation de cet agent. De plus il faut aussi savoir d'ou sera appelé ton agent pour que le print recharge la page courante (si tu veux l'appeler de plusieurs page bonjour le cauchemard...). Là tu vas me dire que tu peux insérer du JS dans le print pour faire un history.back mais faut pas pousser... la bidouille a ses limites.

    Tu peux aussi créer un agent qui appelle ton agent mais niveau conception c'est pas terrible.

    Et puis tu dis que la page vas rester affichée mais figée avec le sablier et en attente du retour de l'agent. C'est pas trés... comment dire... Web 2.0 tout ça




    3. Renaud  07/11/2006 07:59:50


    Tu as raison Julien, c'est pas très web 2.0 tout ça mais c'est surtout que YoGI adore contredire, il est très taquin comme garçon ;)


    4. YoGi  07/11/2006 08:13:57


    Mais euh, un print vers un agent appelé via une URL, ça print vers l'user, pas dans les logs, non ?!
    Et si ta destination peut changer, suffit de la passer dans l'URL :) toto?Openagent&redirect=/mabase.nsf/...
    Quant à la page qui se fige plus ou moins, effectivement il n'y a probablement pas grand chose à faire (et je rajoute à ma liste des définitions du web 2.0 : web 2.0 c'est une page qui ne se fige pas :D)


    5. julien  07/11/2006 08:43:48


    "Mais euh, un print vers un agent appelé via une URL, ça print vers l'user, pas dans les logs, non ?!" --> oui lorsqu'il est actionné par la tâche HTTP mais pas lorsqu'il est exécuté par la tâche AGMR (agent manager). Là les prints vont direct dans les logs.

    "web 2.0 c'est une page qui ne se fige pas :D) --> On peut y mettre ce que l'on veut dans le Web2.0. C'est un peu comme un framework open source . Je participe donc à ma manière à son enrichissement

    @Renaud : Oui je sais et je commence à avoir l'habitude . Ça doit être fatiguant à la longue non ? Je comprends mieux pourquoi vous l'avez lourdé à Paris .

    En plus je suis sûr qu'il aurait fait pareil que moi s'il avait eu la même demande


    6. Benoit  07/11/2006 10:16:05


    Effectivement AJAX va permettre aux utilisateurs de déclencher des agents web de façon non-bloquante (ce que d'ailleurs le client Notes ne peut pas )
    J'ai eu une demande de ce type il y a quelques temps, et je ne touchait pas encore vraiment à AJAX. La solution que j'ai mis en place : le bouton pointe sur une bête page affichant "Veuillez patienter..." qui contient un Meta Redirect vers "/mabase.nsf/agent?openagent". Comme ca l'utilisateur a un message d'attente tandis que l'agent travaille.


    7. Smicky  07/11/2006 12:15:23


    Comme moi aussi j'aime bien contredire, je contre-dit Benoit : si le client Notes sait lancer des agents non bloquant : dans les propriétés de l'agent, tu coches "run as background thread" et voila...(R6 ou plus)


    8. Benoit  08/11/2006 09:30:47


    Ah exact, merci Smicky, je me disais aussi, ca serait pas normal de pouvoir faire plus de choses en web qu'avec un client lourd


    9. tsfig  04/12/2006 11:42:49


    j'ai un message d'erreur :
    "Ajax not defined" !!!!


    10. julien  04/12/2006 15:07:48


    @tsfig :
    Ne pas oublier d'insérer la bibliothèque Prototype.js à votre page.


    11. Pascal  18/01/2007 17:19:40


    Bonjour à tous,
    Pourriez vous m'aider sur un point concernant POST et les agents.

    Comment peut on envoyer des variables par POST à un agent en utilisant AJAX.
    Et une fois dans l'agent, comment faire pour les récupérer?

    Merci de votre aide...


    12. Mika  04/12/2008 07:11:51


    Marche pas MDR.


     Saisir un commentaire^















    Se souvenir de mes informations    

    A propos

    Ce site est destiné à faire connaître mon travail d'expert Domino indépendant et à vous faire partager mes analyses, découvertes et humeurs autour de Lotus Domino et bien d'autres sujets.

    Hébergé sur ma Dedibox

    Bonne visite.
    A propos de moi

    Prénom: Julien
    Nom: Bottemanne
    Adresse: Toulenne (33)

    Originaire du Lot et Garonne, j'habite depuis maintenant 2 4 ans en Gironde. J'aime énormément cette région et je savoure avec ma femme et mes deux filles sa qualité de vie.

    email - julien@domlike.net

     Monthly Archive
     Search
    Contrat

    Tous le contenu de ce site est mis à disposition sous un contrat Creative Commons.

    Contrat Creative Commons

    Paypal

    RSS et autres

    Lotus Domino ND6 RSS News Feed RSS Comments Feed Geo URL RSS Validator Blog Admin Lotus Geek Open Notes Picture Database OpenNTF BlogSphere