multi-tâche avec connecteur Webservices

1
0
-1

Bonjour,

Je souhaite instancier un tâche plusieurs fois avec dans cette tâche un connecteur webservices, me renvoyant un numero de session. Je souhaiterai recupérer les n numero de sessions des n tâches instanciées, pour envoyer n mail avec le numero de session. J'ai bien regardé la doc et elle ne me suffit pas. Pouvez-vous m'aiguiller ou avec-vous des exemples sur lesquels m'appuyer?

Merci d'avance,

Fabrice.

2 answers

1
+1
-1

Bonjour,

Et merci pour ta reactivité.

J'ai bien compris ta démarche et cala a résolu en grosse partie mon soucis. Néamoins, je suis dans le cas où j'ai une liste de deux adresses mail. je dois donc obtenir deux sesssions que j'obtiens bien, or lors que j'envoi mon mail ma premiere adresse recoit deux mails avec les deux numero de session différents et ma deuxième adresse reçoit également deux mail avec ces deux session différentes.

Or je souhaite un mail avec une session et un autre mail avec une autre sessions, dans ce cas précis d'une liste de 2 adresses mail.

Vois-tu où j'aurai pu me tromper?

Comments

Submitted by yannick.lombardi on Thu, 04/02/2015 - 15:28

Je pense que c'est dans le contenu de ton mail que tu as dû utiliser la liste de session complète au lieu de récupérer uniquement la valeur de session qui correspond à l'adresse mail.

Pourrais tu poster le code que tu utilises pour générer le contenu du mail ? Ou une capture d'écran la tâche qui pose problème ?

Submitted by fabrice.ruquois on Thu, 04/02/2015 - 15:45

Dans mon destinataire j'ai :

String str = adresse_mail.toString(); str = str.substring(1, str.length() - 1); return str;

effectivement je recupère dans mes deux adresses mail pour chaque itération.

Ma variable adresse_mail est de type List donc j'ai comme résultat : [toto@toto.fr, titi@titi.fr ]

Submitted by yannick.lombardi on Thu, 04/02/2015 - 15:54

Il faudrait mettre : String str = adresse_mail.get(i); où i est l'indice de l'adresse mail (0 pour le premier, 1 pour le 2eme).

Ce que je ferais pour gérer ça : - Avoir une tâche qui ne fait que l'envoi de mail - Dans l'onglet iteration de cette tâche, choisir une multi-instantiation où la cardinalité est "adresse_mail.size()" - ajouter une variable indice = 0 dans la tâche - dans le connecteur mail, mettre en adresse destinataire "adresse_mail.get(indice)" - dans le connecteur mail, mettre en contenu du mail "liste_session.get(indice)" - dans l'onglet "Operation" de la tâche, incrémenter indice

Submitted by fabrice.ruquois on Thu, 04/02/2015 - 16:19

process

[http://s7.p [http://s7.postimg.org/bj8xdt7hn/process.jpg][] 7.postimg.org/bj8xdt7hn/process.jpg

ce joint mon processus

Submitted by fabrice.ruquois on Thu, 04/02/2015 - 16:24

quand tu me dis "choisir une multi-instantiation où la cardinalité est "adresse_mail.size()", a quel endroit je dois mettre ceci?

Submitted by yannick.lombardi on Thu, 04/02/2015 - 16:49

Le processus me parait bon.

Dans l'onglet "Iteration" de la tâche "Envoi de mail", c'est là que tu peux indiquer la cardinalité après avoir coché "is Multi-instantiated".

Sinon je viens de penser à une autre solution qui me parait plus simple. Dans la tâche "Envoi de mail", tu choisis "is Multi-instantiated" puis "Use a collection". Là tu choisis ta liste "adresse_mail". Il te faut une variable "adresseMail" de type String. Dans Input Data tu choisis "adresseMail". Enfin dans le connecteur mail, il faudra mettre "adresseMail" dans le destinataire et "liste_session.get(adresse_mail.indexOf(adresseMail))" dans le contenu du mail.

Submitted by fabrice.ruquois on Thu, 04/02/2015 - 17:38

Super, ta dernière solution marche très bien.

Merci de ta contribution vraiment.

Bonne soiree a toi.

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 09:09

Bonjour,

je reviens sur le sujet. Mes sessions de webservices doivent se générer avec un utilisateur et mot de passe que je récupère via le connecteur base de données de la tâche "selection_mail". Comment puis-je gérer dynamiquement le fait que, par exemple, la permièrer session de l'utilisateur test1 avec mot de passe mdp1 se redirige vers le mail test1@toto.fr et que la session de l'utilisateur test2 avec mot de passe test2 se redirige vers le mail test2@toto.fr?

Merci d'avance,

Submitted by yannick.lombardi on Wed, 04/08/2015 - 09:18

Bonjour.

Si tu as beaucoup d'informations en rapport avec chaque utilisateur, il faudrait peut être que tu crées un objet "utilisateur" dans lequel tu stockeras toutes les informations de chaque utilisateur. Ca te permettra de pouvoir créer une liste d'utilisateur et de pouvoir itérer sur cette liste pour récupérer les informations. Cela peut être fait très facilement avec la version Subscription de Bonita vu qu'elle intègre un outil qui gère cela. Pour la version Community, il faut par contre créer une classe java (avec n'importe qu'elle IDE) e générer un fichier JAR qu'il faudra ensuite importé dans Bonita.

Ca peut sembler un peu compliquer mais à long terme on y gagne en lisibilité et en facilité de maintenance.

Une autre solution, plus simple mais que je trouve moins propre, est de créer une liste ou une hashmap avec les informations des utilisateurs. Par exemple, un utilisateur sera représenté par la liste suivante : [login, password, email, session, ...] Puis en créant une liste de ces listes, tu pourras ensuite itérer sur chaque utilisateur pour récupérer les informations nécessaire.

Par exemple :

for (List utilisateur : listeUtilisateurs) {
utilisateur.get(0); // login
utilisateur.get(1); // password
utilisateur.get(2); //email
}
Submitted by fabrice.ruquois on Wed, 04/08/2015 - 09:27

J'ai une version subscription. J'en demande peut-etre beaucoup, mais cela se fait avec cette version du coup?

Submitted by yannick.lombardi on Wed, 04/08/2015 - 09:31

N'ayant que la version Community, je ne connais pas les détails, mais il me semble qu'il faut utiliser les Business Data Object : http://documentation.bonitasoft.com/business-data-overview-0#bo

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 09:37

et le type "liste de liste"? est un ArrayList c'est ca?

Submitted by yannick.lombardi on Wed, 04/08/2015 - 09:58

Oui c'est ça. C'est un ArrayList qui va contenir d'autres ArrayList. C'est le type qu'on utilise généralement dans les tableaux (ArrayList<ArrayList<>>).

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 10:10

ws ci-joint la copie ecran de la connexion au ws pour obtenir une session webservices. le nom d'utilisateur et le mot de passe provient de la liste de liste recupérer juste avant.

Comment gérer ça dynamiquement? sachant que ma tache est une multi instance

Submitted by yannick.lombardi on Wed, 04/08/2015 - 10:14

Si j'ai bien compris tu as fait ta multi-instanciation en utilisant la liste de liste. Chaque instance dispose donc d'une liste qui contient les informations de l'utilisateur concerné par cette instance. Pour le nom d'utilisateur, il faut donc mettre un script qui retourne :

return liste.get(0); // si 0 est l'index du nom dans la liste
Submitted by fabrice.ruquois on Wed, 04/08/2015 - 10:26

iteration

Quant tu me dis "Chaque instance dispose donc d'une liste qui contient les informations de l'utilisateur concerné par cette instance.", c'est que je dois récupérer en sortie de mon itération?

Submitted by yannick.lombardi on Wed, 04/08/2015 - 10:32

"list_utilisateurs" est ta liste de liste. Lorsque tu fais la multi-instantiation, chaque instance va récupérer un élément de la liste "list_utilisateurs". Chaque élément étant lui-même une liste. D'après ton image, cette liste dont dispose chaque instance semble être "multiInsanceIterator". C'est donc dans "multiInsanceIterator" qu'il faut récupérer les informations en faisant :

return multiInsanceIterator.get(index);

L'image que tu as posté est différente de la version que j'utilise, mais ça semble être ça.

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 11:44

dans mon connecteur , j'ai cette erreur :

GRAVE: THREAD_ID=396 | HOSTNAME=RUQUOIS-PC | TENANT_ID=1 | org.bonitasoft.engine.expression.exception.SExpressionEvaluationException : "PROCESS_DEFINITION_ID=6380777906997641131 | PROCESS_NAME=liquidation_facture | PROCESS_VERSION=2.1 | PROCESS_INSTANCE_ID=2 | ROOT_PROCESS_INSTANCE_ID=2 | FLOW_NODE_DEFINITION_ID=-7366542511042272978 | FLOW_NODE_INSTANCE_ID=10 | FLOW_NODE_NAME=Webservice session Coriolis | CONNECTOR_DEFINITION_IMPLEMENTATION_CLASS_NAME=Session Coriolis | CONNECTOR_INSTANCE_ID=8 | groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: [] Possible solutions: notify(), tokenize(), size(), size(), tokenize()" org.bonitasoft.engine.expression.exception.SExpressionEvaluationException: PROCESS_DEFINITION_ID=6380777906997641131 | PROCESS_NAME=liquidation_facture | PROCESS_VERSION=2.1 | PROCESS_INSTANCE_ID=2 | ROOT_PROCESS_INSTANCE_ID=2 | FLOW_NODE_DEFINITION_ID=-7366542511042272978 | FLOW_NODE_INSTANCE_ID=10 | FLOW_NODE_NAME=Webservice session Coriolis | CONNECTOR_DEFINITION_IMPLEMENTATION_CLASS_NAME=Session Coriolis | CONNECTOR_INSTANCE_ID=8 | groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: [] Possible solutions: notify(), tokenize(), size(), size(), tokenize()

dans mes expression, j'ai cette formule :

multiInstanceIterator.get(index).toString()

Ce n'est pas çà?

Submitted by yannick.lombardi on Wed, 04/08/2015 - 11:52

L'erreur semble venir d'un appel à la méthode "positive()" sur un objet de type String donc je ne pense pas qu'elle provienne de cette formule. Est ce que tu fais appel à cette méthode quelque part ?

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 11:53

je n'appel pas cette methode non

Submitted by yannick.lombardi on Wed, 04/08/2015 - 11:59

Dans ce cas le problème vient peut être d'un type de donnée qui ne serait pas bon. Peux tu essayer de logger la valeur renvoyée par le script pour voir si c'est bien la bonne valeur qui est récupérée ? Pour ça il faut rajouter ce code dans le script :

import java.util.logging.Logger;
Logger logger= Logger.getLogger("org.bonitasoft");
logger.severe("valeur : "+multiInstanceIterator.get(index));

En faisant ça, tu pourras voir la valeur dans les logs de bonita. Il y aura une ligne "[GRAVE] valeur : XXX

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 12:46

Je crois savoir d'ou vient mon probleme.

Dons mon connecteur webservice je dois spécifier une enveloppe :

enveloppe

c'est une envellope xml. c'est lorsque que j'essaye de la construire par script que ca ne passe pas je pense.

Comment puis-je construire cette enveloppe par script? avec les informations multiInstanceIterator.get(3) pour le login et multiInstanceIterator.get(2) pour le password

Submitted by yannick.lombardi on Wed, 04/08/2015 - 13:59

Quand j'ai une chaine de caractères à créer par script généralement je fais cela :

String enveloppe = """<soapenv:Envelope ....>
<soapenv:Header/>
...
<login xsi:type=...>"
""+multiInstanceIterator.get(3)+"""</login>
<password ...>"
""+multiInstanceIterator.get(2)+"""</password>
...
</soapenv:Envelope>"
"";
return enveloppe;

En faisant cela on crée une chaine de caractère qui contient l'enveloppe et les valeurs login/password sont concaténées dans la chaine.

Je sais qu'il ai aussi possible de rajouter directement les valeurs en utilisant la notation Groovy ${multiInstanceIterator.get(2)} (ou quelque chose dans le genre) mais j'ai déjà rencontré pas mal de difficultés avec cette notation.

Submitted by fabrice.ruquois on Wed, 04/08/2015 - 14:28

c'est ce que j'avais essayé tout à l'heure et ca n'avait pas fonctionné. Maintenant ca ca fonctionne. merci.

Maintenant, je suis à la tâche "envoi de mail". Comment dois je procéder pour récuperer les sessions générer et les envoyer par mail au bon utilisateur? en entrée de liste, je dois avoir ma list_utilisateurs de l'étape precédente je suppose? Mais comme itérateur?

1
0
-1

Bonjour.

Pour multi-instancier un tâche, il faut aller dans l'onglet "Iteration" de cette tâche. Il faut ensuite cocher "is Multi-instantiated". Tu vas devoir choisir si la multi-instantiatation se fait par rapport à une cardinalité (nombre d'instances) ou par rapport à une liste (une instance par objet dans la liste).

Afin de récupérer la liste des numéros de sessions, il te faudra une variable globale de type List qui servira à avoir la liste de toutes les sessions. Il te faudra aussi une variable de tâche de type String ou Int en fonction de si tes numéros de sessions sont des String ou des Int. Cette variable de tâche doit bien sûr être créée dans la tâche qui va être multi-instanciée. Enfin, dans l'onglet "Iteration" de la tâche, tu dois choisir comme Output Data ta variable de tâche, et comme List of output results ta variable de type liste. Pour finir, dans ton connecteur, il faudra que ça soit ta variable de tâche qui récupère le numéro de session.

Si tu as réussi à suivre ces instructions, tu devrais obtenir à la fin ta liste de sessions dans la variable type List.

Notifications