技術

Railsにて非同期処理とスケジュール機能を使い定期的にメール送信する(前編)

Railsにてメールを定期送信する仕組みを作ってみました。

実現方法ですが、sidekiqとsidekiq-scheduleを組み合わせるのが良さげだったので、これを採用。

おそらくこれが最も手っ取り早く実現する方法っぽい。

今回は前編として、事前準備からsidekiqでの実行までです。

動作環境は以下で、rubyやrailsはインストール済みという前提です。

OS  :  macOS Sierra 10.12.6
ruby  :  2.4.0
rails  :  5.1.4

 

redisをインストール

sidekiqを動かすためにまずはredisの環境を構築します。

redisはOSSのデータベースで、いわゆるNoSQLデータベースです。

sidekiqはredisを利用していますので、インストールが必要になります。

Linux
$ sudo yum install -y redis  
 
Mac
$ brew install redis  

インストールが完了したら、redisを起動してみましょう。

Linux
$ service redis start
 
Mac
$ redis-server /usr/local/etc/redis.conf  

sidekiqをインストール

Redisが起動できたら、sidekiqのインストールです。

適当な場所にディレクトリを作成し、その直下にGemfileを置きます。

Gemfileの中身は以下のような感じです。

source 'https://rubygems.org'
gem 'sidekiq'
gem 'sinatra', require: false # ダッシュボード利用のため

準備ができたらsidekiqをインストールします。

$ bundle install

インストールができたら、続いて起動時の設定です。

config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://127.0.0.1:6379'}
end
Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://127.0.0.1:6379'}
end

設定関連です。

config/sidekiq.yml

:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues: - default - test

RailsアプリケーションとsidekiqのWorker を用意

インストールができたら、Railsアプリケーションを作成します。

$bundle exec rails new .

Railsアプリケーションはもちろん事前に作成しておいてもいいです。

sidekiqのWorker を実装します。

app/workers/event_worker.rb
class EventWorker
  include Sidekiq::Worker
  def perform()
    puts 'Hello'
  end
end
 

sidekiqの実行

ここまでできたら実行してみましょう。
 
まずはsidekiqを起動します。
bundle exec sidekiq

railsのコンソールを呼び出します。

bundle exec rails c

sidekiqのWorkerを呼び出します。

EventWorker.perform_async()

sidekiqのコンソールに出力されました!

2017-12-08T06:15:40.959Z 34560 TID-oxm30emxo INFO: Running in ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]

2017-12-08T06:15:40.959Z 34560 TID-oxm30emxo INFO: See LICENSE and the LGPL-3.0 for licensing details.

2017-12-08T06:15:40.959Z 34560 TID-oxm30emxo INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org

2017-12-08T06:15:40.966Z 34560 TID-oxm30emxo INFO: Starting processing, hit Ctrl-C to stop

2017-12-08T06:15:52.948Z 34560 TID-oxm3axijs EventWorker JID-dc2c470225d81e7d656722ea INFO: start

Hello

2017-12-08T06:15:52.950Z 34560 TID-oxm3axijs EventWorker JID-dc2c470225d81e7d656722ea INFO: done: 0.002 sec

ちょっとわかりにくいですが、"Hello"という文字が表示されています。

sidekiqには管理画面が用意されています。

管理画面の設定は以下です。

config/routes.rb
require 'sidekiq/web'
mount Sidekiq::Web, at: "/sidekiq"

これでsidekiqの実行まできました。

定期的にアプリを実行して、メールを送信するまでは後編に続きます。

プログラミング
Railsにて非同期処理とスケジュール機能を使い定期的にメール送信する(後編)

本記事はRailsにてメールを定期送信する仕組みを解説したものです。 今回は後編で、定期的にアプリを実行し、さらにメール送信を実装します。 前編はこちら。 動作確認は以下で行っています。 OS  : ...

続きを見る

-技術

© 2023 FIRE達成のフリーランスエンジニアブログ