Ruby 1.9.2 でdelayed_job を使ったらNoMethodError にぶつかった

どうも、shibuso です。春イベントですね。私の資源力は53 万です。(実際には80 万ぐらいあります:P)

既に動いているシステムのバージョンってなかなか上げられないのが困りモノです。今回も古いRuby を使っていたがために問題にぶつかったので、今となってはあまり需要は無さそうですがまとめてみました。

まず問題が起こった環境はRuby 1.9.2p320 とRails 3.1.3 で動いていたところにdelayed_job_active_record 4.0.1 (現時点で最新)を入れた状態でした。最初Ruby 1.9.3p448 を使用していたところ問題なく動いていたので、恐らくRuby 1.9.3 以降では起こらないのではないかと思います。

問題はdelayed_job を呼び出すためにdelay メソッドを呼び出して実行した時に、DB のdelayed_jobs テーブルにあるhandler カラムに入るパラメータの一部に間違いがあるために正しく実行されないというものです。以下、適当なModule を非同期で呼びだそうとした時の正しい例と間違った例を記載します。

呼び出す箇所

HogeHoge.delay.hoge

正しい値の例 (Ruby 1.9.3p448 + delayed_job_active_record 4.0.1)

object: !ruby/module HogeHoge

間違っている値の例 (Ruby 1.9.2p320 + delayed_job_active_record 4.0.1)

object: !ruby/object:Module {}

ここの情報が間違っているためにModule を上手く呼び出せず、結果としてNoMethodError が発生していました。

どうもこの現象は当時それなりに問題になっていた模様で、検索するとGitHub のIssue でやり取りが見れました。2 年前ですが(苦笑)
NoMethodError with delayed_job · Issue #323 · collectiveidea/delayed_job · GitHub

このIssue の中にある投稿で解決できた報告があり、且つ環境が似ていたので同じくdelayed_job 2.1.4 を入れてみたところ動くようになりました!

Gemfile

gem delayed_job, '2.1.4'

原因は何か複数あるような感じで、このIssue を見ているとHeroku 関連の問題もあるみたいでした。ちなみに今回私が経験したのはHeroku ではなく普通のサーバーと手元のVM 環境で、nginx + unicorn です。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

shibuso

明治大学大学院理工学研究科を修了後ウェブ企業に就職。その後ソーシャルゲーム企業に転職し、後に登録会員数400万人を超えたタイトルのローンチを担当。2012年にBPSに入社。 Java, PHP, Perl, Rubyと渡り歩いて来ました。BPSに入社後RubyとRailsを使い始めましたが、今では一番好きな言語になっています。 休日の趣味はゲームと愛車のCBR250Rでのツーリングです。 たまにblog書いてます。http://www.shibuso.net

shibusoの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ