multi-tâche avec connecteur Webservices

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.

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.

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?

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 ?

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 ]

Il faudrait mettre :
String str = adresse_mail.get(i);
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

process

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

ce joint mon processus

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

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.

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

Merci de ta contribution vraiment.

Bonne soiree a toi.

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,

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
}

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

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

et le type “liste de liste”? est un ArrayList c’est ca?

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<>>).

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

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

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?

“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.