Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top