Периодические задачи в Ruby On Rails

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

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

Здесь я кратко опишу процесс установки и конфигурирования плагина для выполнения какой-либо периодической задачи.

Установка BackgrounDrb

Сначала необходимо установить требуемые гемы:

sudo gem install chronic packet # Устанавливаем требуемые гемы

script/plugin install http://svn.devjavu.com/backgroundrb/trunk # Устанавливаем плагин

rake backgroundrb:setup # Конфигурирем плагин

Конфигурация

Конфигурирование осуществляется путем редактирования файла config/backgroundrb.yaml. Изначально, после установки он может выглядеть:

:backgroundrb: 
  :port: 11006
  :ip: 0.0.0.0
В раздел :backgroundrb: можно добавлять различные опции, наиболее важными из которых являются:
  • environment - какую среду Rails загружать (environment, test, production)
  • port - порт, котрый будет слушать демон
  • ip - адрес хоста, на котором будет работать демон
При реализации периодических задач единственное условие на хост и порт состоит в том, чтобы демон мог открыть сокет с этими параметрами. Разумеется, открывать его наружу несколько небезопасно.

Создание периодической задачи

Для создания новой периодической задачи необходимо выполнить несколько шагов:
  1. Сгенерировать обработчик, вызвав:
    script/generate worker my_worker
    В результате в директорию lib/workers будет добавлен новый класс MyWorker:
    
    class MyWorker < BackgrounDRb::MetaWorker
      set_worker_name :my_worker
    
      def create(args = nil)
        # this method is called, when worker is loaded for the first time
      end
    end 
    
  2. Опеределить в MyWorker метод, который будет выполнять задачу, например do_something
  3. В файле конфигурации добавить раздел :schedules:, и в него следующий код:
    
      :my_worker:
        :do_something:
          :trigger_args: * */30 * * * *
    
    В :trigger_args: задается условие периодичности в виде cron-строки, в частности вышеприведенная запись означает: каждые 30 минут вызывать метод do_something объекта MyWorker. В качестве альтернативы, можно задать периодичность в виде:
    
      :trigger_args:
        :start: <%= Time.now + 5.seconds %>
        :end: <%= Time.now + 10.minutes %>
        :repeat_interval: <%= 1.minute %> 
    
    В результате весь файл config/backgroundrb.yml будет выглядеть приблизительно так:
    
    :backgroundrb: 
      :port: 11006
      :ip: 0.0.0.0
      :environment: production
    :schedules:
      :my_worker:
        :do_something:
          :trigger_args: * */30 * * * *
    

Запуск процесса

Для запуска процесса как демона, используются команды script/backgroundrb start и script/backgroundrb stop. При вызове script/backgroundrb без параметров, процесс выполняется в терминале.

Ссылки

 Подписаться на RSS

 #  #  #  #  #  #  #  #  #  #

Добавить комментарий