Question

J'ai une application Flex qui appelle une fonction qui recherche dans une grande collection de documents. En fonction du terme recherché, l'utilisateur peut souhaiter arrêter la demande de flex.

Je & # 8217; j’aimerais non seulement empêcher l’application flex d’attendre la demande, mais également celle de la demande CFC. Est-ce possible? Quelle & # 8217; meilleure approche pour ce faire?

Était-ce utile?

La solution

Pour ajouter à la réponse de Ben Doom, j'inclus un exemple de code permettant d'accomplir cette tâche. Il existe de nombreuses approches et méthodes pour nommer, organiser et appeler le code ci-dessous, mais j'espère que cela sera utile.

À un moment donné, lors du démarrage de la demande, stockez des informations sur le processus dans une étendue partagée et renvoyez un ID au client. Voici des exemples de fonctions pouvant être utilisées sur des requêtes de page ou à distance.

<cffunction name="createProcess" output="false">
  <cfset var id = createUUID()>
  <cfset application.processInfo[id] = {
    progress = 0,
    kill = false
  }>
  <cfreturn id />
</cffunction>

Le client peut ensuite vérifier la progression en interrogeant le serveur ou envoyer une demande de mise à mort du processus

<cffunction name="getProcessProgress" output="false">
  <cfargument name="processID" required="true">
  <cfreturn application.processInfo[arguments.processID].progress />
</cffunction>

<cffunction name="killProcess" output="false">
  <cfargument name="processID" required="true">
  <cfset application.processInfo[arguments.processID].kill = true />
</cffunction>

Le processus côté serveur en question peut alors frapper une fonction, par exemple pendant une boucle, pour vérifier s'il doit abandonner le traitement et nettoyer tous les travaux appropriés.

<cffunction name="shouldKillProcess" output="false">
  <cfargument name="processID" required="true">
  <cfreturn application.processInfo[arguments.processID].kill />
</cffunction>

Autres conseils

Je ne pense pas qu'il existe un contrôle direct pour arrêter un appel de page en externe. Selon la documentation, seul le fil lui-même et son parent peuvent abandonner un fil donné.

Cependant, vous pouvez définir un indicateur pour un thread donné dans une étendue partagée.

Supposons que vous appelez une méthode qui lance un traitement en arrière-plan. Il génère un ID de thread unique et le renvoie à l'appelant. Le thread recherche un indicateur dans (par exemple) la portée de l'application qui lui dit de s'arrêter. Il vérifie à chaque sous-étape du processus d'arrière-plan. Il pourrait avorter à tout moment où ce drapeau est lancé.

Pour lancer l'indicateur, ajoutez une méthode d'abandon prenant le nom du thread à abandonner, ainsi qu'une sécurité suffisante pour qu'aucun tiers ne puisse commencer à supprimer les threads.

Si vous utilisez ColdFusion 8, vous pouvez utiliser la balise <cfthread>. Vous pouvez lancer le processus de recherche sur son propre fil, puis utiliser l'appel distant pour mettre fin au fil de recherche si nécessaire.

Vous pouvez terminer par programmation les demandes avec <cfabort/> ou <cfsetting requesttimeout="0"/> - mais cela concerne le serveur CF, ce que je ne pense pas être ce que vous demandez?

En terminant à distance ... eh bien, si vous avez FusionReactor, il pourrait être possible de le contacter en utilisant Flex et de le faire interrompre la demande pour vous. (Vous pouvez certainement essayer de mettre fin aux demandes dans FusionReactor, mais si Flex peut ou non demander à FR de les arrêter, vous devez le demander sur la liste de diffusion FR si vous pouvez le faire.)


Une autre solution consiste peut-être à concevoir et à structurer la recherche de manière à ce qu'elle réponde à plusieurs demandes, mais sa faisabilité dépendra exactement de ce que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top