Domanda

Ho un'applicazione Flex che chiama una funzione che cerca una grande raccolta di documenti. A seconda del termine di ricerca, l'utente potrebbe voler interrompere la richiesta dalla flessibilità.

I & # 8217; d non solo impedisce all'applicazione flex di aspettarsi la richiesta, ma anche di interrompere la richiesta CFC. È possibile? Qual è l'approccio migliore per farlo?

È stato utile?

Soluzione

Per aggiungere alla risposta di Ben Doom, sto includendo un esempio di codice di come questo può essere realizzato. Esistono diversi approcci e modi di nominare, organizzare e chiamare il codice qui sotto, ma speriamo che sia utile.

Ad un certo punto durante l'avvio della richiesta, archiviare le informazioni sul processo in ambito condiviso e restituire un ID al client. Ecco alcune funzioni di esempio che potrebbero essere utilizzate sulla pagina o su richieste remote.

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

Il client può quindi controllare lo stato di avanzamento del polling server o inviare una richiesta di interruzione del processo

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

L'effettivo processo sul lato server in questione può quindi colpire una funzione, ad esempio durante un ciclo, per verificare se deve interrompere l'elaborazione e pulire qualsiasi lavoro nel modo appropriato.

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

Altri suggerimenti

Non credo che esista un modo diretto per interrompere una chiamata di pagina esternamente. Secondo i documenti, solo il thread stesso e il suo genitore possono interrompere un determinato thread.

Tuttavia, è possibile impostare un flag per un determinato thread in un ambito condiviso.

Supponiamo che tu chiami un metodo che avvia l'elaborazione in background. Genera un ID thread univoco e lo restituisce al chiamante. Il thread cerca un flag (ad esempio) nell'ambito dell'applicazione che gli dice di fermarsi. Controlla ad ogni passo del processo in background. Potrebbe interrompersi in qualsiasi momento in cui venga lanciata la bandiera.

Per lanciare il flag, aggiungi un metodo di interruzione che prende il nome del thread che deve essere interrotto, insieme a una sicurezza sufficiente per assicurarsi che una terza parte non possa semplicemente iniziare a uccidere i thread.

Se si utilizza ColdFusion 8 è possibile utilizzare il tag <cfthread>. Puoi spawnare il processo di ricerca sul suo thread e quindi utilizzare la chiamata remota per terminare il thread di ricerca secondo necessità.

Puoi terminare le richieste a livello di codice con <cfabort/> o <cfsetting requesttimeout="0"/> - ma questo è il lato del server CF delle cose, che non penso sia quello che stai chiedendo?

Terminandolo da remoto ... beh, se hai FusionReactor potrebbe essere possibile contattarlo usando Flex e farlo interrompere per te. (Puoi certamente provare a terminare le richieste all'interno di FusionReactor, ma se Flex può effettivamente chiedere a FR di fermarlo ... dovresti chiederlo sulla mailing list di FR se c'è un modo per farlo.)


Probabilmente una soluzione alternativa è provare a progettare la ricerca in modo che funzioni su più richieste, ma la fattibilità dipenderà esattamente da ciò che stai cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top