Prossessus metier : comment optimiser

4.0
Tags: #<Tag:0x00007fc9f3baed88>
Prossessus metier : comment optimiser
0

#1


Bonjour,

j’ai créé un processus métier qui permet de créer un message, sélectionner les contact, enregistrer le lien message-contact afin d’envoyer des sms en masse.

L’objet contact contient les élèves des lycées qui utilisent les transports scolaires. Potentiellement plus de 100000.
Pour un message, les utilisateurs peuvent vouloir sélectionner un nombre d’élèves très important.

Je fais des tests sur des grandes quantités et ce n’est pas très performant.

dans le postValidate du processus, après la sélection des contacts, je boucle sur les contacts sélectionnés, j’alimente l’objet qui associe le message créé et chaque contast sélectionné et et je fais un save :

// après sélection des contacts
if(step=="CMSG-003"){
	var msgId=this.getParameter("CMSG-001.Field.row_id").get(0);
		// All selected row IDs
	var df = context.getDataFile("Field","row_id",true);
	var ids = df!==null ? df.getValues() : null;
	for (var i=0; ids && i<ids.length; i++){
		var contactId=ids[i];
		obj.setRowId(ObjectField.DEFAULT_ROW_ID);
		//genereNum(obj,obj.getField("aleContactMsgNum"));
		obj.getField("aleContactMsgMsg_fk").setValue(msgId);
		obj.getField("aleContactMsgContact_fk").setValue(contactId);
		obj.save();
	}
}

pour 200 contacts, le traitement dure 10 secondes et j’ai le message suivant :
CreateCrbAleMsg.postValidate||Avertissement évaluation script: Duration = 9591ms exceeds 1000ms

dans le cas d’un message à 2000 contacts, ça va être très très long.

est-ce-que vous auriez une piste d’amélioration ?


(François Genestin) #2

Le warning est là pour signaler que le script synchrone est long et l’utilisateur attend.
Si les volumes sont très importants, il faut traiter ce besoin en asynchrone.

10 secondes pour 200 contacts = 50ms par contact, ça me semble tout à fait raisonnable.
Vous pouvez essayer de coder ces hook en java pour aller un peu plus vite (code compilé) mais en terme d’i/o avec la base cela ne changera rien.

S’il n’y a rien après cette activité, elle peut uniquement lancer une action asynchrone qui fait le travail en tache de fond (dans un thread à part), dans le pool des jobs. Pour cela il faut créer une action asynchrone avec ce code et remplacer ce script par un simple invokeAction(Action action, Map<String, String> params) sur l’objet (où params devra véhiculer les ids sélectionnées).