Empêcher une exécution simultanée

Bonjour,

J’ai un bouton qui exécute une méthode pour parcourir toutes les lignes de la table et les synchroniser avec les données du contrôle des habitants.

Comme ce processus est long, j’aimerai empêcher les autres utilisateurs (qui ne voient pas que le processus est en cours d’exécution) de cliquer sur le bouton pour relancer le processus.

Y a-t-il une manière de faire que vous préconisez?

Merci pour vos réponses

Fabrice

Un pattern de ce type là devrait répondre au besoin:

Grant sys = Grant.getSystemAdmin();

String param = "MON_PROCESSUS";
String val = sys.getSystemParam(param);

if (Tool.isEmpty(val)) {
	sys.setSystemParam(param, Tool.getCurrentDateTime());
	try {
		// ici le processus long...

		return Message.formatSimpleInfo("Le processus est terminé");
	} finally {
		sys.removeSystemParam(param, false);
	}
} else {
	return Message.formatSimpleInfo("Un processus est déjà en cours depuis: " + val);
}

Quitte à checker aussi ce param dans le isActionEnable pour faire disparaitre le bouton mais c’est moins clair pour les users

Merci David.

Ca convient parfaitement.

En v5 et v6 (pour rappel la v4 n’est plus maintenue depuis Janvier 2024), pour plus de robustesse il faudrait aussi supprimer le param dans le platform hook postPlatformInit (= au (re)démarrage de l’instance) pour gérer le cas d’un éventuel plantage de l’instance alors que le processus est en cours (et que donc le finally n’a pas été atteint)

Ou alors, si vous êtes sur un noeud unique Simplicité, vous pouvez utiliser un param système mémoire (via get/set/removeParameter) plutôt qu’un param système persistant en base

Est-ce que le removeSystemParam existe en V4?

Non effectivement ça n’existait pas encore en v4…

Un sys.setSystemParam(param, "" /*ou null*/) doit faire l’affaire dans le contexte mais si vous êtes en mono-noeud autant utiliser un paramètre en mémoire :

Grant sys = Grant.getSystemAdmin();

String param = "MON_PROCESSUS";
String val = sys.getParameter(param);

if (Tool.isEmpty(val)) {
	sys.setParameter(param, Tool.getCurrentDateTime());
	try {
		// ici le processus long...

		return Message.formatSimpleInfo("Le processus est terminé");
	} finally {
		sys.removeParameter(param);
	}
} else {
	return Message.formatSimpleInfo("Un processus est déjà en cours depuis: " + val);
}

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.