0

私は、delayed_jobs を使用してバックグラウンドでタスクを実行しています。

ajax を使用してタスクを開始しています。ワーカーは uuid を取得し、タスクのステータスと結果をキャッシュするために書き込みます。

次に、別の ajax を使用して毎秒ポーリングし、結果が得られたかどうかを確認します。

私のローカルホストではうまく動作しますが、heroku にアップロードするとうまくいきません。

ログを確認したところ、ワーカーは書き込み済みのキャッシュを読み取ることができますが、メイン スレッドがアクセスしようとすると空になります。

シンサーバー、memcachier、dalli を使用しています。

これは、キャッシュへの書き込みに使用されるコードです。

def self.get_meta_info(link_url,job_uuid)
    始める
      #…………
      結果 = {
          タイトル:「ここにあるもの…」

      }
      #…………

      Rails.cache.write({job_uuid: job_uuid,type: '結果'},result.to_json)
      Rails.cache.write({job_uuid: job_uuid,type: 'ステータス'},'成功')

#次の行はログのデータを返します
      Rails.logger.info("#{job_uuid} のハッシュに書き込まれた get_meta_info")
      Rails.logger.info("#{job_uuid} の get_meta_info の結果: #{Rails.cache.read({job_uuid: job_uuid,type: 'result'})}")

    レスキュー例外 => ex
      Rails.cache.write({job_uuid: job_uuid,type: '結果'},ex)
      Rails.cache.write({job_uuid: job_uuid,type: 'ステータス'},'エラー')
    終わり
  終わり

これは、ポーリングに使用するサーバー側のコードです: (毎秒 ajax によって呼び出されます)

  def get_meta_info_result
    job_uuid = params[:job_uuid]
    status = Rails.cache.read({job_uuid: job_uuid,type: 'ステータス'})
    #次の行はログに何も返さない
    Rails.logger.info("nlp_provider_controller.get_meta_info_result for uuid #{job_uuid} read status #{status}")
    Rails.logger.info("nlp_provider_controller.get_meta_info_result for uuid #{job_uuid} 読み取り結果 #{Rails.cache.read({job_uuid: job_uuid,type: 'result'})}")
    Respond_to do |フォーマット|
      ステータス==「成功」の場合
        format.json {render json: Rails.cache.read({job_uuid: job_uuid,type: 'result'})}
      elsif ステータス=='エラー'
        format.json{render :nothing => true, status: :no_content }
      そうしないと
        format.json{render :nothing => true, status: :partial_content }
      終わり
    終わり

それを解決する方法がわかりません。

タンク・ユー!

4

1 に答える 1

0

これを解決するのに2日。愚かな間違い。

development.rb と production.rb の 2 つの構成があります。私はそれを知らなかったわけではありませんが、通常は別の初期化子で構成します。

本番環境ではなく、開発環境で Redis を構成しました。

追加した:

redis_url = ENV["REDISTOGO_URL"] || "redis://127.0.0.1:6379/0/MyApp"
MyApp::Application.config.cache_store = :redis_store, redis_url

(ベース: http://blog.jerodsanto.net/2011/06/connecting-node-js-to-redis-to-go-on-heroku/ )

そしてそれは動作します。

于 2013-06-02T12:59:57.483 に答える