簡體   English   中英

Rails 6 從 Sidekiq Job 獲取結果 - 有可能嗎?

[英]Rails 6 grab results from Sidekiq Job - is it possible?

我有 Sidekiq 工作( SyncProductsWorker ),它觸發了一個Imports::SynchronizeProducts類,負責一些外部 API 調用。

module Imports
  class SyncProductsWorker
    include Sidekiq::Worker
    sidekiq_options queue: 'imports_sync'

    def perform(list)
      ::Imports::SynchronizeProducts.new(list).call
    end
  end
end

Imports::SynchronizeProducts類給出了一個帶有一些注釋的 monads 結果數組,例如

=> [Failure("999999 Product code is not valid"), Failure(" 8888889 Product code is not valid")]

我想捕捉這些結果以在 FE 上顯示它們。 有可能這樣做嗎? 如果我這樣做:

def perform(list)
  response = ::Imports::SynchronizeProducts.new(list).call
  response
end

然后在控制器內部:

def create
  response = ::Imports::SyncProductsWorker.perform_async(params[:product_codes])

  render json: { result: response, head: :ok }
end

結果我會有一些數字

=> "df3615e8efc56f8a062ba1c2"

我不相信你想要的是可能的。

https://github.com/mperham/sidekiq/issues/3532

返回值將像 Ruby 進程中的任何其他未使用數據一樣被 GC 處理。 喬布斯在 Sidekiq 中沒有“結果”,而 Sidekiq 對價值沒有任何作用。

您將需要某種模型來跟蹤您的后台任務。 這是即興的,但應該給你一個想法。

例如

# @attr result [Array]
# @attr status [String] Values of 'Pending', 'Error', 'Complete', etc..
class BackgroundTask < ActiveRecord
  attr_accessor :product_codes
  after_create :enqueue
  
  def enqueue
    ::Imports::SyncProductsWorker.perform_async(product_codes, self.id)
  end
end

def perform(list, id)
  response = ::Imports::SynchronizeProducts.new(list).call
  if (response.has_errors?)
    BackgroundTask.find(id).update(status: 'Error', result: response)
  else
    BackgroundTask.find(id).update(status: 'Complete', result: response)
  end
end

然后只需將 BackgroundTask 模型用於您的前端顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM