Можно ли остановить запрос ColdFusion? - PullRequest
4 голосов
/ 02 октября 2008

У меня есть приложение Flex, которое вызывает функцию, которая ищет большую коллекцию документов. В зависимости от условия поиска пользователь может захотеть остановить запрос от flex.

Мне бы хотелось не только остановить приложение Flex от ожидания запроса, но и остановить запрос CFC. Это возможно? Каков наилучший подход для этого?

Ответы [ 4 ]

6 голосов
/ 02 октября 2008

Я не думаю, что есть прямой способ остановить вызов страницы извне. Согласно документам, только сам поток и его родитель могут прервать данный поток.

Однако вы можете установить флаг для данного потока в общей области.

Допустим, вы вызываете метод, который запускает некоторую фоновую обработку. Он генерирует уникальный идентификатор потока и возвращает его вызывающей стороне. Поток ищет флаг (например) в области приложения, который говорит ему остановиться. Он проверяет на каждом шаге фонового процесса. Это может прервать в любой момент, когда флаг брошен.

Чтобы сбросить флаг, добавьте метод прерывания, который принимает имя потока, который должен быть прерван, наряду с достаточной безопасностью, чтобы убедиться, что третья сторона не может просто начать уничтожение потоков.

2 голосов
/ 08 октября 2008

Чтобы добавить ответ Ben Doom, я привожу пример кода, как это можно сделать. Есть несколько подходов и способов имен, организации и вызова кода ниже, но, надеюсь, это полезно.

В какой-то момент во время запуска запроса сохраните информацию о процессе в общей области и верните идентификатор клиенту. Вот примеры функций, которые можно использовать для запросов страниц или удаленных запросов.

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

Клиент может затем проверить ход выполнения с помощью сервера опроса или отправить запрос на уничтожение процесса

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

Реальный рассматриваемый процесс на стороне сервера может затем нажать на функцию, например, во время цикла, чтобы проверить, следует ли прервать обработку и очистить любую работу соответствующим образом.

<cffunction name="shouldKillProcess" output="false">
  <cfargument name="processID" required="true">
  <cfreturn application.processInfo[arguments.processID].kill />
</cffunction>
1 голос
/ 02 октября 2008

Если вы используете ColdFusion 8, вы можете использовать тег <cfthread>. Вы можете запустить процесс поиска в своем собственном потоке, а затем использовать удаленный вызов для завершения потока поиска, если это необходимо.

0 голосов
/ 02 октября 2008

Вы можете программно завершать запросы с помощью <cfabort/> или <cfsetting requesttimeout="0"/> - но это на стороне CF-сервера, но я не думаю, что вы спрашиваете?

Удаленное завершение ... ну, если у вас есть FusionReactor, то может связаться с ним с помощью Flex и прервать запрос для вас. (Конечно, вы можете попытаться завершить запросы в FusionReactor, но может ли Flex на самом деле попросить FR остановить его ... вам нужно будет указать это в списке рассылки FR, если есть способ сделать это.)


Возможно, альтернативное решение состоит в том, чтобы попытаться построить поиск так, чтобы он работал по нескольким запросам, но насколько это возможно, будет зависеть от того, что именно вы ищете.

...