запуск функции ruby ​​on rails без открытия браузера - PullRequest
1 голос
/ 30 мая 2011

Привет
Мне нужно создать приложение ruby ​​on rails, которое будет вызывать каждую 1 секунду для удаленного URL Api, чтобы перехватить событие, которое должно произойти на этом удаленном веб-сервере. URL-адрес

"remoteservername.com/folder/folder/waitforevents"

как только произошло желаемое событие, мне нужно выполнить некоторые действия и снова вызвать URL-адрес «remoteservername.com/folder/folder/waitforevents».
Это должно быть непрерывной задачей и сделано без открытия браузера. Это означает, что это приложение должно запускаться сразу после запуска моего веб-сервера.

поэтому мой вопрос: как я могу запустить приложение ruby ​​on rails, не открывая браузер? просто сервер

до сих пор у меня был опыт написания rails-приложений, которые запускались при открытии браузера и при вызове некоторого URL. поэтому я буду рад, если вы поможете мне в этом вопросе

СПАСИБО

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Вы уверены, что вам нужны рельсы для такого применения? Я предлагаю вам попробовать сделать работу с необработанным кодом ruby, проще в обслуживании. Как уже говорили другие, вы можете использовать cron для регулярного запуска приложения.

1 голос
/ 30 мая 2011

Вы можете использовать cron вместе с ./script/rails runner, который может выполнить любой метод из вашего приложения rails.

Поскольку вам нужно выполнять какое-то действие каждую секунду, вы можете запустить это runner один раз и создать цикл. Вы можете запустить его из cron, сохранить PID где-нибудь, а затем попросить cron убить данный процесс, ИЛИ вы можете просто перевести тайм-аут в свой код Ruby в цикле. Простой пример:

class MyModelOrAnything
  def self.start_loop
    stop_fname = "./stop_the_loop"
    while !File.exist? stop_fname 
      do_this_action
      sleep 1
    end
  ensure
    File.unlink stop_fname  if File.exist? stop_fname
  end
end

Задача cron может затем создать файл "stop_the_loop" в известном каталоге, и ваша задача остановится через секунду.

На самом деле, в этом случае cron может не понадобиться. Поскольку у вас должен быть только один экземпляр этого скрипта, было бы лучше запустить его вручную и остановить вручную. Если вы хотите использовать cron, вы можете добавить семафороподобный файл, который сообщит сценарию, что один процесс уже запущен (файл должен быть удален с помощью блока «sure»).

Пример конфигурации cron:

0 8  * * 1 cd /my/app && bundle exec ./script/rails runner ThisObject.start_loop
0 22 * * 5 touch /my/app/stop_the_loop

.. и пример с этим семафором:

class MyModelOrAnything
  def self.start_loop
    running_fname = "./i_am_working"
    return :already_running if File.exist? running_fname
    stop_fname = "./stop_the_loop"
    begin
      File.open(running_fname,'w') {|f| f.write Time.now.to_s(:db) }
      while !File.exist? stop_fname 
        do_this_action
        sleep 1
      end
    ensure
      File.unlink running_fname if File.exist? running_fname
      File.unlink stop_fname  if File.exist? stop_fname
    end
  end
end
0 голосов
/ 30 мая 2011

Хороший способ - использовать отложенное задание:

https://github.com/collectiveidea/delayed_job

По этой теме есть сообщение, которое может помочь:

http://railscasts.com/episodes/171-delayed-job

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...