From 02e83ea776115a92daf2afe607e5c190bf01ec7d Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 31 Mar 2015 11:42:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E5=90=8E=E5=8F=B0=E8=BF=9B=E7=A8=8B=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 ++ app/controllers/account_controller.rb | 10 ++++----- app/controllers/applied_project_controller.rb | 4 ++-- app/controllers/documents_controller.rb | 2 +- app/controllers/files_controller.rb | 4 ++-- app/controllers/projects_controller.rb | 2 +- app/controllers/users_controller.rb | 6 ++--- app/helpers/account_helper.rb | 4 ++-- app/models/comment_observer.rb | 5 +---- app/models/document_observer.rb | 5 +---- app/models/forum.rb | 4 +--- app/models/issue_observer.rb | 4 +--- app/models/journal_observer.rb | 4 +--- app/models/journals_for_message_observer.rb | 4 +--- app/models/mail_handler.rb | 2 +- app/models/mailer.rb | 18 +++++++++++++++ app/models/memo.rb | 6 ++--- app/models/memo_observer.rb | 4 +--- app/models/message_observer.rb | 5 +---- app/models/news_observer.rb | 5 +---- app/models/relative_memo.rb | 2 +- app/models/wiki_content_observer.rb | 10 ++------- app/services/users_service.rb | 4 +--- config/settings.yml | 5 +++++ .../20150331031554_create_delayed_jobs.rb | 22 +++++++++++++++++++ ...032810_add_delayjob_enabled_to_settings.rb | 5 +++++ db/schema.rb | 18 ++++++++++++++- lib/tasks/email.rake | 3 +-- script/delayed_job | 5 +++++ 29 files changed, 106 insertions(+), 68 deletions(-) create mode 100644 db/migrate/20150331031554_create_delayed_jobs.rb create mode 100644 db/migrate/20150331032810_add_delayjob_enabled_to_settings.rb create mode 100644 script/delayed_job diff --git a/Gemfile b/Gemfile index 70281fedf..045642faf 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,8 @@ unless RUBY_PLATFORM =~ /w32/ gem 'zip-zip' end +gem 'delayed_job_active_record'#, :group => :production +gem 'daemons' gem 'grape', '~> 0.9.0' gem 'grape-entity' gem 'seems_rateable', '~> 1.0.13' diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 2cf404ffb..f8d0f5dd1 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -88,9 +88,7 @@ class AccountController < ApplicationController # create a new token for password recovery token = Token.new(:user => user, :action => "recovery") if token.save - Thread.new do - Mailer.lost_password(token).deliver - end + Mailer.run.lost_password(token) flash[:notice] = l(:notice_account_lost_email_sent) redirect_to signin_url return @@ -228,7 +226,7 @@ class AccountController < ApplicationController user = User.find(params[:user]) if params[:user] token = Token.new(:user => user, :action => "register") if token.save - Mailer.register(token).deliver + Mailer.run.register(token) else yield if block_given? @@ -366,7 +364,7 @@ class AccountController < ApplicationController token = Token.new(:user => user, :action => "register") if user.save and token.save UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0) - Mailer.register(token).deliver + Mailer.run.register(token) flash[:notice] = l(:notice_account_register_done) @@ -401,7 +399,7 @@ class AccountController < ApplicationController if user.save UserStatus.create(:user_id => user.id ,:changsets_count => 0, :watchers_count => 0) # Sends an email to the administrators - Mailer.account_activation_request(user).deliver + Mailer.run.account_activation_request(user) account_pending else yield if block_given? diff --git a/app/controllers/applied_project_controller.rb b/app/controllers/applied_project_controller.rb index f2c0eb056..8e70ed32c 100644 --- a/app/controllers/applied_project_controller.rb +++ b/app/controllers/applied_project_controller.rb @@ -13,7 +13,7 @@ class AppliedProjectController < ApplicationController @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id]) if @applieds.count == 0 appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id]) - Mailer.applied_project(appliedproject).deliver + Mailer.run.applied_project(appliedproject) @status = 2 else @status = 1 @@ -31,7 +31,7 @@ class AppliedProjectController < ApplicationController @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id]) if @applieds.count == 0 appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id]) - Mailer.applied_project(appliedproject).deliver + Mailer.run.applied_project(appliedproject) end #redirect_to project_path(params[:project_id]) diff --git a/app/controllers/documents_controller.rb b/app/controllers/documents_controller.rb index 9bf2ee846..570726320 100644 --- a/app/controllers/documents_controller.rb +++ b/app/controllers/documents_controller.rb @@ -110,7 +110,7 @@ class DocumentsController < ApplicationController render_attachment_warning_if_needed(@document) if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added') - Mailer.attachments_added(attachments[:files]).deliver + Mailer.run.attachments_added(attachments[:files]) end redirect_to document_url(@document) end diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 28156ac0c..0575294d5 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -241,7 +241,7 @@ class FilesController < ApplicationController render_attachment_warning_if_needed(container) if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added') - Mailer.attachments_added(attachments[:files]).deliver + Mailer.run.attachments_added(attachments[:files]) end # TODO: 临时用 nyan @@ -270,7 +270,7 @@ class FilesController < ApplicationController attachments = Attachment.attach_filesex(@course, params[:attachments], params[:attachment_type]) if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added') - Mailer.attachments_added(attachments[:files]).deliver + Mailer.run.attachments_added(attachments[:files]) end # TODO: 临时用 nyan diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 41876e041..8ed9fcfef 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -336,7 +336,7 @@ class ProjectsController < ApplicationController def send_mail_to_member if !params[:mail].blank? && User.find_by_mail(params[:mail].to_s).nil? email = params[:mail] - Mailer.send_invite_in_project(email, @project, User.current).deliver + Mailer.run.send_invite_in_project(email, @project, User.current) @is_zhuce =false flash[:notice] = l(:notice_email_sent, :value => email) else diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 4db471ab4..a230688dc 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -553,7 +553,7 @@ class UsersController < ApplicationController @user.pref.save @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) - Mailer.account_information(@user, params[:user][:password]).deliver if params[:send_information] + Mailer.run.account_information(@user, params[:user][:password]) if params[:send_information] respond_to do |format| format.html { @@ -620,9 +620,9 @@ class UsersController < ApplicationController @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) if was_activated - Mailer.account_activated(@user).deliver + Mailer.run.account_activated(@user) elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil? - Mailer.account_information(@user, params[:user][:password]).deliver + Mailer.run.account_information(@user, params[:user][:password]) end respond_to do |format| diff --git a/app/helpers/account_helper.rb b/app/helpers/account_helper.rb index 8ef2d6095..445a1670e 100644 --- a/app/helpers/account_helper.rb +++ b/app/helpers/account_helper.rb @@ -23,7 +23,7 @@ module AccountHelper token = Token.new(:user => user, :action => "register") if user.save and token.save UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0) - Mailer.register(token).deliver + Mailer.run.register(token) #flash[:notice] = l(:notice_account_register_done) #render action: 'email_valid', locals: {:mail => user.mail} else @@ -51,7 +51,7 @@ module AccountHelper if user.save UserStatus.create(:user_id => user.id ,:changsets_count => 0, :watchers_count => 0) # Sends an email to the administrators - Mailer.account_activation_request(user).deliver + Mailer.run.account_activation_request(user) #account_pending else yield if block_given? diff --git a/app/models/comment_observer.rb b/app/models/comment_observer.rb index a46e53ab9..ff5b31446 100644 --- a/app/models/comment_observer.rb +++ b/app/models/comment_observer.rb @@ -18,10 +18,7 @@ class CommentObserver < ActiveRecord::Observer def after_create(comment) if comment.commented.is_a?(News) && Setting.notified_events.include?('news_comment_added') - ##by senluo - thread3=Thread.new do - Mailer.news_comment_added(comment).deliver - end + Mailer.run.news_comment_added(comment) end end end diff --git a/app/models/document_observer.rb b/app/models/document_observer.rb index 447952c70..72516916c 100644 --- a/app/models/document_observer.rb +++ b/app/models/document_observer.rb @@ -17,9 +17,6 @@ class DocumentObserver < ActiveRecord::Observer def after_create(document) - ##by senluo - thread2=Thread.new do - Mailer.document_added(document).deliver if Setting.notified_events.include?('document_added') - end + Mailer.run.document_added(document) if Setting.notified_events.include?('document_added') end end diff --git a/app/models/forum.rb b/app/models/forum.rb index 6843ab678..0e664fded 100644 --- a/app/models/forum.rb +++ b/app/models/forum.rb @@ -36,9 +36,7 @@ class Forum < ActiveRecord::Base end def send_email - Thread.start do - Mailer.forum_add(self).deliver if Setting.notified_events.include?('forum_add') - end + Mailer.run.forum_add(self) if Setting.notified_events.include?('forum_add') end # Updates topic_count, memo_count and last_memo_id attributes for +board_id+ def self.reset_counters!(forum_id) diff --git a/app/models/issue_observer.rb b/app/models/issue_observer.rb index e404a4a1c..51f64c783 100644 --- a/app/models/issue_observer.rb +++ b/app/models/issue_observer.rb @@ -18,13 +18,11 @@ class IssueObserver < ActiveRecord::Observer def after_create(issue) - Thread.start do # 将跟踪者与本项目的其他成员都设为收件方,并去重,不在进行抄送, recipients = issue.recipients - issue.watcher_recipients + issue.watcher_recipients recipients.each do |rec| - Mailer.issue_add(issue,rec).deliver if Setting.notified_events.include?('issue_added') + Mailer.run.issue_add(issue,rec) if Setting.notified_events.include?('issue_added') end - end end end diff --git a/app/models/journal_observer.rb b/app/models/journal_observer.rb index b58464a9b..1fca58f37 100644 --- a/app/models/journal_observer.rb +++ b/app/models/journal_observer.rb @@ -23,14 +23,12 @@ class JournalObserver < ActiveRecord::Observer (Setting.notified_events.include?('issue_status_updated') && journal.new_status.present?) || (Setting.notified_events.include?('issue_priority_updated') && journal.new_value_for('priority_id').present?) ) - Thread.start do # 将跟踪者与本项目的其他成员都设为收件方,并去重,不在进行抄送, recipients = journal.recipients - journal.watcher_recipients + journal.watcher_recipients recipients.each do |rec| - Mailer.issue_edit(journal,rec).deliver + Mailer.run.issue_edit(journal,rec) end - end end end end diff --git a/app/models/journals_for_message_observer.rb b/app/models/journals_for_message_observer.rb index 0e5f29d03..ee8e28b86 100644 --- a/app/models/journals_for_message_observer.rb +++ b/app/models/journals_for_message_observer.rb @@ -1,9 +1,7 @@ # Added by young class JournalsForMessageObserver < ActiveRecord::Observer def after_create(journals_for_message) - thread1 = Thread.start do - Mailer.journals_for_message_add(User.current, journals_for_message).deliver - end + Mailer.run.journals_for_message_add(User.current, journals_for_message) end end diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb index 8421fb67d..da1af66a8 100644 --- a/app/models/mail_handler.rb +++ b/app/models/mail_handler.rb @@ -101,7 +101,7 @@ class MailHandler < ActionMailer::Base end add_user_to_group(@@handler_options[:default_group]) unless @@handler_options[:no_account_notice] - Mailer.account_information(@user, @user.password).deliver + Mailer.run.account_information(@user, @user.password) end else if logger && logger.error diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 50b0c075b..7a6061835 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -27,6 +27,24 @@ class Mailer < ActionMailer::Base { :host => Setting.host_name, :protocol => Setting.protocol } end + + class MailerProxy + def initialize(cls) + @target = cls + end + def method_missing(name, *args, &block) + if Setting.delayjob_enabled && Object.const_defined?('Delayed::Worker') + @target.delay.send(name, *args, &block) + else + @target.send(name, *args, &block).deliver + end + end + end + + def self.run + MailerProxy.new(self) + end + # author: alan # 发送邀请未注册用户加入项目邮件 # 功能: 在加入项目的同时自动注册用户 diff --git a/app/models/memo.rb b/app/models/memo.rb index eb0c86855..e3e66d251 100644 --- a/app/models/memo.rb +++ b/app/models/memo.rb @@ -56,9 +56,7 @@ class Memo < ActiveRecord::Base # } def sendmail - thread1=Thread.new do - Mailer.forum_message_added(self).deliver if Setting.notified_events.include?('forum_message_added') - end + Mailer.run.forum_message_added(self) if Setting.notified_events.include?('forum_message_added') end def cannot_reply_to_locked_topic @@ -115,7 +113,7 @@ class Memo < ActiveRecord::Base def send_notification if Setting.notified_events.include?('message_posted') - Mailer.message_posted(self).deliver + Mailer.run.message_posted(self) end end diff --git a/app/models/memo_observer.rb b/app/models/memo_observer.rb index 66cabe923..621dcf3d8 100644 --- a/app/models/memo_observer.rb +++ b/app/models/memo_observer.rb @@ -1,8 +1,6 @@ class MemoObserver < ActiveRecord::Observer def after_create(memo) - thread1=Thread.new do - Mailer.forum_message_added(memo).deliver if Setting.notified_events.include?('forum_message_added') - end + Mailer.run.forum_message_added(memo) if Setting.notified_events.include?('forum_message_added') end end diff --git a/app/models/message_observer.rb b/app/models/message_observer.rb index 383301664..1f438f77a 100644 --- a/app/models/message_observer.rb +++ b/app/models/message_observer.rb @@ -17,9 +17,6 @@ class MessageObserver < ActiveRecord::Observer def after_create(message) - ##by senluo - thread5=Thread.new do - Mailer.message_posted(message).deliver if Setting.notified_events.include?('message_posted') - end + Mailer.run.message_posted(message) if Setting.notified_events.include?('message_posted') end end diff --git a/app/models/news_observer.rb b/app/models/news_observer.rb index 8b9bc7b4b..12258e7ca 100644 --- a/app/models/news_observer.rb +++ b/app/models/news_observer.rb @@ -17,9 +17,6 @@ class NewsObserver < ActiveRecord::Observer def after_create(news) - ##by senluo - thread6=Thread.new do - Mailer.news_added(news).deliver if Setting.notified_events.include?('news_added') - end + Mailer.run.news_added(news) if Setting.notified_events.include?('news_added') end end diff --git a/app/models/relative_memo.rb b/app/models/relative_memo.rb index f087fce2b..181aa89f6 100644 --- a/app/models/relative_memo.rb +++ b/app/models/relative_memo.rb @@ -159,7 +159,7 @@ class RelativeMemo < ActiveRecord::Base def send_notification if Setting.notified_events.include?('message_posted') - Mailer.message_posted(self).deliver + Mailer.run.message_posted(self) end end diff --git a/app/models/wiki_content_observer.rb b/app/models/wiki_content_observer.rb index 187c02288..6e13d1a8a 100644 --- a/app/models/wiki_content_observer.rb +++ b/app/models/wiki_content_observer.rb @@ -17,18 +17,12 @@ class WikiContentObserver < ActiveRecord::Observer def after_create(wiki_content) - ##by senluo - thread7=Thread.new do - Mailer.wiki_content_added(wiki_content).deliver if Setting.notified_events.include?('wiki_content_added') - end + Mailer.run.wiki_content_added(wiki_content) if Setting.notified_events.include?('wiki_content_added') end def after_update(wiki_content) if wiki_content.text_changed? - ##by senluo - thread8=Thread.new do - Mailer.wiki_content_updated(wiki_content).deliver if Setting.notified_events.include?('wiki_content_updated') - end + Mailer.run.wiki_content_updated(wiki_content) if Setting.notified_events.include?('wiki_content_updated') end end end diff --git a/app/services/users_service.rb b/app/services/users_service.rb index 39ca37d26..80aa34d45 100644 --- a/app/services/users_service.rb +++ b/app/services/users_service.rb @@ -95,9 +95,7 @@ class UsersService # create a new token for password recovery token = Token.new(:user => user, :action => "recovery") if token.save - Thread.new do - Mailer.lost_password(token).deliver - end + Mailer.run.lost_password(token) return l(:notice_account_lost_email_sent,:locale => user.language) end end diff --git a/config/settings.yml b/config/settings.yml index 56cb8ac6c..cd3f2974e 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -60,6 +60,11 @@ per_page_options: default: '25,50,100' mail_from: default: trustieforge@gmail.com + +### delayjob for send email. +delayjob_enabled: + default: 1 + bcc_recipients: default: 1 plain_text_mail: diff --git a/db/migrate/20150331031554_create_delayed_jobs.rb b/db/migrate/20150331031554_create_delayed_jobs.rb new file mode 100644 index 000000000..27fdcf6cc --- /dev/null +++ b/db/migrate/20150331031554_create_delayed_jobs.rb @@ -0,0 +1,22 @@ +class CreateDelayedJobs < ActiveRecord::Migration + def self.up + create_table :delayed_jobs, force: true do |table| + table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue + table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually. + table.text :handler, null: false # YAML-encoded string of the object that will do work + table.text :last_error # reason for last failure (See Note below) + table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + table.datetime :locked_at # Set when a client is working on this object + table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + table.string :locked_by # Who is working on this object (if locked) + table.string :queue # The name of the queue this job is in + table.timestamps null: true + end + + add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority" + end + + def self.down + drop_table :delayed_jobs + end +end diff --git a/db/migrate/20150331032810_add_delayjob_enabled_to_settings.rb b/db/migrate/20150331032810_add_delayjob_enabled_to_settings.rb new file mode 100644 index 000000000..2f87ba720 --- /dev/null +++ b/db/migrate/20150331032810_add_delayjob_enabled_to_settings.rb @@ -0,0 +1,5 @@ +class AddDelayjobEnabledToSettings < ActiveRecord::Migration + def change + Setting.create(name: 'delayjob_enabled', value: 1 ) + end +end diff --git a/db/schema.rb b/db/schema.rb index 21279c72b..6f215e48f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150328115230) do +ActiveRecord::Schema.define(:version => 20150331032810) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -422,6 +422,22 @@ ActiveRecord::Schema.define(:version => 20150328115230) do add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" + create_table "delayed_jobs", :force => true do |t| + t.integer "priority", :default => 0, :null => false + t.integer "attempts", :default => 0, :null => false + t.text "handler", :null => false + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" + create_table "discuss_demos", :force => true do |t| t.string "title" t.text "body" diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake index 676618825..efd3efdd8 100644 --- a/lib/tasks/email.rake +++ b/lib/tasks/email.rake @@ -199,8 +199,7 @@ END_DESC task :day => :environment do users = User.where(mail_notification: 'day') users.each do |user| - mailer = Mailer.send_for_user_activities(user, Date.today, 1) - mailer.deliver if mailer + Mailer.run.send_for_user_activities(user, Date.today, 1) end end end diff --git a/script/delayed_job b/script/delayed_job new file mode 100644 index 000000000..edf195985 --- /dev/null +++ b/script/delayed_job @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) +require 'delayed/command' +Delayed::Command.new(ARGV).daemonize