отправка писем асинхронно из Padrino через Resque

Я пытаюсь асинхронно отправлять электронные письма из приложения 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 gem для отправки электронных писем из /lib — см. обновленную суть обновленного модуля для отправки асинхронных электронных писем через resque.

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


person darcy_clark    schedule 22.11.2011    source источник


Ответы (1)


Мне очень нравится 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 из вашего контроллера, вы можете создать простую таблицу очереди nubble, например:

MyQueue.create(:from => '[email protected]', :to => '[email protected]', :subject => 'Order changed')
person DAddYE    schedule 22.11.2011