отправка писем асинхронно из Падрино через Resque - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь отправлять электронные письма из приложения Padrino асинхронно - я пытался использовать команду Ruby fork, но это не очень хорошо масштабируется, я думаю, я пробовал и delayed_job, но теперь остановился на Resque (главным образом потому, чтовеб-интерфейс, с которым это идет, очень хороший).

У меня это работает, за исключением того, что мне приходилось использовать Pony вместо padrino-mailer для отправки моих писем из / lib.Буду признателен за любую помощь в удалении Пони с картинки.Основная проблема у меня в том, что я не знаю, как вызвать padrino-mailer извне контроллера или помощника.Я уверен, что это возможно, и был бы признателен за любую помощь.Если мы сможем разобраться в этом, я думаю, что это может быть очень полезно для других разработчиков Padrino - асинхронная отправка электронных писем, вероятно, является очень распространенным требованием к масштабируемости ядра для веб-приложений.

См. Здесь для получения информации о том, как установить и настроить Resque: https://github.com/defunkt/resque

Затем посмотрите здесь, как отправить асинхронные сообщения электронной почты из Padrino через Resque: https://gist.github.com/1384630


Обновление - я перешел на использование гема ruby ​​mail для отправки писем из / lib - см. Обновленную суть обновленного модуля для отправки асинхронных писем через resque.

Я все ещеинтересно узнать, можно ли принудительно запустить padrino-mailer из / lib - помощь по этому вопросу все еще приветствуется.

1 Ответ

1 голос
/ 22 ноября 2011

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

Для простых, но очень гибких демонов в стиле cron вы можете взглянуть на: https://github.com/daddye/foreverb

Код довольно прост:

#!/usr/bin/env ruby
require 'yaml' # not really necessary but some envs need it...
require 'rubygems' unless defined?(Gem)
require 'forever'
boot = File.expand_path('../../config/boot.rb', __FILE__)

Forever.run :fork => true do
  before :each do
    require boot
    # Here we setup app projects, if you need only once you can do
    # MyApp.setup_application!
    # Which load their dependencies
    Padrino.mounted_apps.each do |app|
      app.app_obj.setup_application!
    end
  end

  every 1.minutes do
    MyQueue.each do |q|
      MyApp.deliver(:notification, q)
      q.destroy
    end
  end
end

Поместите этот простой файл под project_root/lib, примените chmod +x file_name, запустите его с:

./lib/file_name start|stop|restart

Наконец, если вам нужно встроить его в enqueue из вашего контроллера, вы можете создать простую таблицу очередей, например:

MyQueue.create(:from => 'info@godaddy.com', :to => 'buyer@gmail.com', :subject => 'Order changed')
...