1

私はメールを配信するために特別なアプローチを使用しています。

まず、電子メールを配信するためのメソッドの呼び出しを制御メソッドに抽象化しますsend_email 。次に、制御メソッドの実行を遅らせました。

電子メールを配信するためのメソッドにハードコードされている値を送信することは問題ないようですが、そのメソッドに渡される値は送信しません。

制御方法:

  # this method is being delayed to control the time of sending email
  def send_email

    # approach 1 : just send a email after method send_email is executed 
    # In delay situtation : after 2 minutes
    # Otherwise : no delay
    Notifier.create_long_task(1234).deliver

    # approach 2: explicitly states to delay sending email process 
    # (same result with the above one)
    # 
    # Notifier.delay.create_long_task(1234)
  end

  handle_asynchronously :send_email, :run_at => Proc.new { 2.minutes.from_now }

上記のコードでは、1234を配信メソッドに渡しました。配信メソッドの下では、1234がインスタンス変数に割り当てられます。@id

 def create_long_task(longTask_id)
    @greeting = "Hi"
    @longTask ="delay setting"
    @id = longTask_id

    mail to: "j-@hotmail.com", :subject => 'Long Task Created'
  end

メールテンプレートは次のようになります。

    Notifier#create_long_task
    Instance variable 1 : <%= @greeting %>
    Instance variable 2 : <%= @longTask %>
    Instance Id : <%= @id %>
    You created a long task 

したがって、楽観的にするために、電子メールには3つのインスタンス変数が表示され、2つは配信メソッドにハードコーディングされ、1つは外部から配信メソッドに渡されます

ただし、結果には、配信メソッドにハードコーディングされている2つのインスタンス変数しか表示されません。

Notifier#create_long_task
Instance variable 1 : Hi
Instance variable 2 : delay setting
Instance Id : 
You created a long task 

とても不思議です。コメントアウトしhandle_asynchronouslyて遅滞なくメールを送信すると、すべてのインスタンス変数を確認できます。ですから、1234を配信方法に渡すことはできないと思います。次のような遅延のない電子メールの結果:

Notifier#create_long_task
Instance variable 1 : Hi
Instance variable 2 : delay setting
Instance Id : 1234
You created a long task 

これは非常に長く複雑な問題の説明です。誰かがこの問題を解決できるかどうか本当に感謝しています。

4

1 に答える 1

2

遅延ジョブは、実行するまでコードへの変更を取得しないため、再起動することを忘れないでください。

于 2012-11-11T20:14:33.727 に答える