問題タブ [rails-activejob]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - NameError: 初期化されていない定数 MyJob ActiveJob および Sidekiq
sidekiq/activejob
統合に問題があります。perform_later
MyJob クラスからメソッドを呼び出すコントローラーがあります。これはperform
メソッドで機能しますが、に変更するperfom_later
と、開発ログにジョブがスケジュールされます。ただし、sidekiq ダッシュボードの再試行セクションを見るとわかりますNameError: uninitialized constant
(下の画像を見てください)。
これらは私のファイルです:
犯罪取締官
Sidekiq イニシャライザ
ruby - 成功ハンドラーと失敗ハンドラーを ActiveJob に渡す
HTTP 経由で外部システムからデータをロードすることになっている ActiveJob があります。そのジョブが完了したら、後処理を行ってデータを別の外部システムに送信する 2 番目のジョブをキューに入れたいと考えています。
最初のジョブに 2 番目のジョブのことを知られたくないので、
- カプセル化
- 再利用性
- 基本的に初職の仕事じゃない
同様に、データの読み込みが失敗した場合に次に何が起こるかを最初のジョブに気にさせたくありません。おそらくユーザーに通知されるか、タイムアウト後に再試行するか、単にログに記録して手を投げるか、もう一度例外の詳細に基づいて異なる可能性があり、そのためのロジックや、それを処理するための他のシステムへの接続をジョブに含める必要はありません。
Java (私が最も経験を積んでいる場所) では、Guava のListenableFutureのようなものを使用して、事後に成功および失敗のコールバックを追加できます。
ただし、ActiveJob は、この種の外部コールバック メカニズムを提供していないようです。「アクティブ ジョブの基本」の関連 セクションafter_perform
からわかる限りでrescue_from
は、ジョブ クラス内から呼び出されることのみを意図しています。またafter_peform
、成功と失敗を区別するものではありません。
したがって、私が思いついた最善の方法は (そして、それが非常に優れていると主張しているわけではありません)、ジョブのperform
メソッドにいくつかのラムダを渡すことです。したがって、次のようになります。
(補足:ラムダをパラメーターとして宣言するための yardoc 構文が何であるかはわかりません。これは正しいように見えますか、それとも失敗するともっともらしいですか?)
呼び出し元は、これらを渡す必要があります。
少なくとも呼び出し側では、それはひどいことではありませんが、不格好に思えます。これには、私が見つけていない一般的なパターンがあるのではないかと思わずにはいられません。また、Ruby/Rails の初心者として、ActiveJob を曲げて、本来意図されていないことを実行しているのではないかと少し心配しています。私が見つけたすべての ActiveJob の例は、「ファイア アンド フォーゲット」です。結果を非同期的に「返す」ことは、ActiveJob のユース ケースではないようです。
また、別のプロセスでジョブを実行する Resque のようなバックエンドの場合、これがまったく機能するかどうかもわかりません。
これを行うための「Rubyの方法」は何ですか?
更新: dre-hh によって示唆されたように、ActiveJob は適切なツールではないことが判明しました。また、信頼性が低く、状況が複雑すぎました。代わりにConcurrent Rubyに切り替えました。これは、ユース ケースにより適していて、タスクがほとんど IO バウンドであるため、GIL にもかかわらず、 MRI でも十分に高速です。
ruby-on-rails - Rails - バックグラウンドジョブの ActionDispatch::Http::UploadedFile
私はcsvとExcel Railscastのインポートと同様のアイデアを使用していますが、そのエピソードの標準コードは処理に時間がかかるため(ActiveRecordを使用してファイル内の各行の新しいレコードを作成します)、Herokuでタイムアウトが発生していますインポート プロセスをバックグラウンド ジョブに移行したいと考えています。
ファイル変数 (ActionDispatch::Http::UploadedFile 型) をジョブに送信できなかったので、代わりに file.original_filename と file.path の個々の変数を送信しました
file /var/folders/q3/xn0bp7yd2m56_4lbq0069jj80000gn/T/RackMultipart20150319-72431-1a4pnja.xlsx does not exist
ジョブが開始される前にファイルが既に削除されているため、ジョブは次のように発生していると思われるエラーで失敗します。
アップロードされたファイルは、1 回のリクエストで有効期限が切れる一時ファイルです。オブジェクトがファイナライズされると、Ruby はファイルのリンクを解除するため、別のメンテナンス タスクでファイルをクリーンアップする必要はありません。
ActionDispatch::Http::UploadedFile
ActionDispatch::Http::UploadedFile でアップロードされたファイルは、バックグラウンド ジョブで使用できませんか?
Rails 4.2、ActiveJob、および Resque を使用しています
ruby-on-rails - Rails 4.2 ActiveJob を介して Sidekiq にジョブを追加するが、ジョブが実行されない
私はレールが初めてです。Rails 4.2 と Ruby 2.1.5 を使用して、Active Job 経由で基本的な image_resize ジョブを実行しようとしています。
ここからコードをコピーしようとしました:
私はこの仕事を持っています:
そして、私はこのrakeタスクを作成しました:
画像でいっぱいのフォルダーを設定し、タスクを実行すると、次の行が表示されます。
フォルダ内のすべての画像を印刷します。その部分が機能します。
しかし、ジョブの「プット」は実行されません。私はそれが決して起こらないような気がします。
デフォルトのポートで実行されている redis があり、sidekiq gem がインストールされています。私は何が欠けていますか?
ワーカーが死亡したのか、単に間違って呼び出しただけなのか、どうすればわかるのでしょうか? これをデバッグするにはどうすればよいですか?
[UPDATE] さて、私はこのファイルを見つけました:
そしてそれは仕事でいっぱいです:
しかし、何も処理されていません。仕事なし、アウトプットなし。ワーカーのコードで何かが壊れていると思いますが、どうすればそれを見つけることができますか?