問題タブ [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 - Rails 4では、送信されたすべての電子メールを添付ファイル付きで保存し、後で再送信する方法は?
Rails 4 アプリケーションでは、オブザーバーを使用してすべての送信メールを DB に保存しています。config/initializers/all_emails_observer.rb には、おおよそ次のコードがあります。
ここで、管理者がメール ログから任意のメールを再送信できるようにする別の機能を追加する必要があります。
私がすぐに見ることができる解決策がいくつかあります。
- すべての添付ファイル (通常およびインライン) を保存するコードを追加し、新しい電子メールを生成して再送信するメソッドを実装します。私は今これに取り組んでいます。
- メーラー クラス、メーラー メソッド、および引数を保存します (たとえば、GlobalId を使用してシリアル化します)。管理者がメールを再送信する必要がある場合 - 新しいメールを最初から生成します。私はこの方法が好きではありません。理想的には、最初に送信されたときとまったく同じ内容 (添付ファイルを含む) のメールを再送信したいからです。それ以来、メーラーはバグ/タイプミスを修正できましたが、メールが再送信されたときに、これらすべてのバグとタイプミスが残っていることを望みます.
Rails 4.2 がリリースされ、ActiveJob が安定したため、これを行う標準的な方法が見つかりませんでした。キューに入れられたすべてのメールは、送信後すぐに削除されます (delayed_job バックエンドを確認しました)。完了したメーラー ジョブを別の DB テーブルに保存し、必要に応じてそのジョブを再キューイングする方法が必要です。
Rails 6 が完全に変更されたオブザーバー API でリリースされたときにオブザーバーを書き直したくないので、可能であれば ActiveJob の電子メールのシリアル化メカニズムを再利用して目標を達成したいと考えています。
送信済みメールの再送信を有効にするより良い方法は何ですか?
ここで同様の質問をすでに確認したことに注意してください。
ただし、どちらも送信したメールを保存する方法に関するものであり、後でそのまま再送信する方法に関するものではありません。
ありがとうございました!アレックス。
ruby-on-rails - 並列SidekiqジョブがRailsでコードを実行するのを防ぐ方法
私には、次のような仕事を行う約 10 人の労働者がいます。
問題は、特定の時間に 2 人以上のワーカーがこのコードを正確な時間に実行することです。そのため、後で 2 人以上のユーザーが同じemail
.
一意の電子メールは条件付きであるため、私の状況では DB 一意のインデックスを作成することはできemail
ません。一意の電子メールを持つべきユーザーもいれば、持たないユーザーもいます。
User
私のモデルには一意性の検証があることに言及することは注目に値しますが、 と の間.find_or_initialize_by
に.save
、ユーザー オブジェクトが既に作成されているかどうかに依存するコードがあるため、それでも役に立ちません。
悲観的ロックと楽観的ロックを試しましたが、役に立たなかった、または適切に実装していなかっただけかもしれません...これに関する提案があれば.
私が考える唯一の解決策は、これらのコード行が実行されるたびに他のスレッド (Sidekiq ジョブ) をロックすることですが、これを実装する方法がよくわかりませんし、これが提案可能なアプローチであるかどうかもわかりません。
助けていただければ幸いです。
編集
私の特定のケースでは、このジョブは上で述べたものよりも少し複雑であるため、ジョブに電子メールパラメーターを配置するのは難しいでしょう。ジョブは実際には、ジョブのセクションが上記のコードであるエクスポート スクリプトです。上記の機能を別の別のワーカーに分離することも可能だとは思いません...ジョブフロー全体がシリアルである必要があり、どの部分も並列/非同期で処理されるべきではないためです。このジョブは、最終的にマスター ジョブによって管理される別のジョブによって管理されるジョブの 1 つにすぎません。
ruby-on-rails - プラグイン resque-history と ActiveJob で resque gem を使用している人はいますか?
完了したタスクを監視するために resque-history プラグインを使用します。
まず、この文字列require 'resque-history/server'をルート ファイルに含めます。すると、ダッシュボードに新しい履歴タブが表示されます。
これは/app/jobs/welcome_email_job.rbのコードです
ジョブが完了すると、統計タブに処理されたジョブの数が表示されますが、履歴タブは空で、テーブル ヘッドのみです。この悩みは解決できますか?
ruby-on-rails - Rails 4.2 では、ジョブが既にキューに入れられているかどうかを確認します
ActiveJob バックエンドとして Rails 4.2 とdelayed_job 4.0.6 を使用しています。
キューに 1 回だけ入れたいジョブがあります。問題のジョブの実行には 1 分以上かかります。モデルのコールバックによってキューに入れられます。コールバックは、ジョブが完了するよりもはるかに頻繁に発生します。今後、ジョブを複数回キューに入れる必要はありません。
これは、私が達成しようとしていることの擬似コードです。
再度呼び出されたときにジョブのインスタンスが実行されている場合は、将来のために引き続きキューに入れておく必要があります。将来の実行のためにジョブを最大1回キューに入れる方法を探しています。
答えはdelayed_jobに固有のものでなければならないと思いますが、ActiveJobに一般化できればさらに良いでしょう。
ruby-on-rails - Rails 4.2でActionMailerが使用するActiveJobキューはどれですか?
Rails 4.2 では、ActionMailer は ActiveJob と呼ばれる新しいバックグラウンド ジョブ抽象化レイヤーの使用をサポートしています。ActiveJob は、ジョブをバックグラウンド キューに入れ、後でジョブをプッシュしたコード フローの外で処理します。
問題は、ActionMailer が #deliver_later メソッドによるメールの自動エンキューをサポートするようになったため、これらのメールがどのキューに送信されるかということです。