2016-09-03 12 views
0

重い持ち上げ方法をバックグラウンドジョブに入れたいと思います。 Rails 5 ActiveJobまたはRedisの使用。どちらを使うべきかわからないActiveJob :: SerializationError

基本的には、宝石を使用し、そのAPI呼び出しのものを自分のローカルデータベースに埋め込むAPIがあります。

コントローラー:

... 

before_action :get_api 

def do_later 
    GetApiJob.perform_later(foo) 
    # Call foo later 
end 

def foo 
    @apis.map do |api| 
    puts api.title 
    end 
end 

private 
    def get_api 
    @apis = ShopifyAPI::Product.find(:all) 
    end 

... 

GetApiJob:

... 

queue_as :default 

def perform(a) 
    a 
    # Expect to see a list, if any, of api's name 
end 

... 

私はそれがバックグラウンドジョブにfooを置くdo_laterを呼び出します。そのサンプルコードをやって、私が取得:

ActiveJob :: SerializationErrorこのため

私はSidekiqを使用する必要がありますか。

+0

、あなたの実際のコードを投稿することができますか? –

+0

@MichałMłoźniakこんにちは、ありがとうございます。コードはshopify APIで更新されました。それだけで、同じエラーが表示されるはずです。 – Sylar

答えて

0

ActiveJobは、Railsアプリケーションとさまざまなバックグラウンドジョブランナー間の一般的なインタフェースです。 ActiveJobを単独で使用することはできませんが、sidekiq(およびRedis)やdelayed_jobなどを追加する必要があります。

ActiveJobは、Railsアプリケーションで渡された引数のシリアル化を行い、バックグラウンドジョブ側でこれを逆シリアル化します。しかし、何かをシリアル化することはできません.Finnum、String、Float、基本値の配列、ハッシュ、ActiveRecordオブジェクトなどの基本型のみをシリアル化できます。 ActiveRecordオブジェクトは、GlobalIdを使用してシリアル化されます。

あなたのケースでは、ActiveRecordコレクションではないshopify apiクライアントから返されたコレクションを渡しており、ActiveJobはそれをシリアル化する方法を知らない。

api呼び出しをバックグラウンドジョブ自体に移動すると最適です。

コントローラ

# No before_action 

def do_later 
    # No arguments, because we are fetching all products 
    GetApiJob.perform_later 
end 

GetApiJob

queue_as :default 

def perform 
    # Fetch list of products 
    products = ShopifyAPI::Product.find(:all) 
    # Process list of products 
end 
+0

ああ、私は参照してください。クール。ありがとうございました。 – Sylar

関連する問題