На сервере обработки - PullRequest
4 голосов
/ 27 марта 2012

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

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

Возможно ли это даже в рамках Coldfusion, или мне нужно изучить код, который будет принимать данныеи обработать его как отдельную программу?

Ответы [ 5 ]

6 голосов
/ 27 марта 2012

ColdFusion 8 представил тег cfthread , который может вам помочь.

 <cfthread 
    required 
    name="thread name" 
    optional 
    action="run" 
    priority="NORMAL|HIGH|LOW" 
    zero or more application-specific attributes> 

        Thread code 

    </cfthread> 
3 голосов
/ 27 марта 2012

Чтобы сделать это надежно, вы можете использовать таблицу базы данных в качестве очереди заданий.Таким образом, вы, когда пользователь отправляет данные, вы вставляете запись в базу данных, указывая, что есть некоторая работа, которую нужно сделать.Затем вы создаете запланированное задание в администраторе CF, который опрашивает скрипт, который получает следующее задание из очереди и выполняет описанную вами обработку.После завершения он может обновить базу данных, а затем вы можете предупредить пользователя о том, что задание завершено.

Имеет смысл?

2 голосов
/ 27 марта 2012

Другой вариант, который может вам подойти, - использовать AJAX для отправки данных на сервер. Это довольно простой в использовании метод, поскольку вы можете использовать практически тот же код CF, который у вас есть сейчас, и вместо этого вам нужно всего лишь изменить страницу отправки формы (и вы даже можете использовать некоторые ненавязчивые методы javascript, чтобы изящно это ухудшить, если JavaScript не присутствует).

Вот пример использования jQuery и BlockUI , который будет работать для ненавязчивой отправки любой формы на вашей странице в фоновом потоке:

<script>
$(function () {
  $("form").on("submit", function (e) {
    var f = $(this);
    e.preventDefault();
    $.ajax({
      method: f.attr("method"),
      url: f.attr("action"),
      data: f.serialize(),
      beforeSend(jqXHR, settings) {
        f.blockUI({message: "Loading..."});
      },
      complete(jqXHR, textStatus) {
        f.unblockUI();
      },
      success: function (data, textStatus, jqXHR) {
        // do something useful with the response
      },
      error: function(jqXHR, textStatus, errorThrown) {
        // report the error
      }
    });
  });
});
</script>
1 голос
/ 27 марта 2012

Вы должны объединить все три из этих ответов, чтобы получить полное решение.

  • Используйте CF Thread, чтобы «запустить» работу.
  • Добавьте запись в БД, чтобы сообщить, что процесс идет полным ходом.
  • Используйте Ajax, чтобы проверить запись в БД, чтобы увидеть, завершена ли работа. когда ваш поток завершает обновление записи - Ajax находит работу завершить, и вы отображаете какое-то сообщение или индикатор на пользователя экран, чтобы они могли перейти к шагу 2 или что-то еще. Так что каждый из этих ответы содержат ключ к полному решению.

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

0 голосов
/ 27 марта 2012

Для этого мы используем шлюз событий CF.Пользователь отправляет файл через веб-форму, а шлюз событий отслеживает этот каталог загрузки.Основываясь на имени файла, шлюз знает, как он должен обрабатывать файл в базе данных.Таким образом, единственная реальная задержка, с которой сталкивается пользователь, - это время фактической передачи файла со своего компьютера на сервер.Однако нам не нужно информировать пользователя о каких-либо статусах, связанных с процессом, хотя мы можем легко увидеть, как это сделать, если мы это сделаем.

...