Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用sidekiq呼叫另一名工人内部的工人,_Ruby On Rails_Ruby_Multithreading_Sidekiq - Fatal编程技术网

Ruby on rails 用sidekiq呼叫另一名工人内部的工人,

Ruby on rails 用sidekiq呼叫另一名工人内部的工人,,ruby-on-rails,ruby,multithreading,sidekiq,Ruby On Rails,Ruby,Multithreading,Sidekiq,我打电话给另一个有sidekiq的工人有问题。 我有两个工人,看起来像这样: class UserExportWorker include Sidekiq::Worker sidekiq_options queue: :users, unique: true, retry: false def perform(user_id) # code that exports user to external service via API UserExportStatus

我打电话给另一个有sidekiq的工人有问题。 我有两个工人,看起来像这样:

class UserExportWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_id)
    # code that exports user to external service via API
    UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
  end
end

class UserExportStatusWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_export_id, user_id)
    # code that check if exporting user to external service via API is finished
    if export.completed?
      user.update(status: 'exported')
    else
      UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
    end
  end
end
UserExportWorker通过API将用户导出到某个外部服务,并运行UserExportStatusWorker,检查外部API中的导出是否已完成,如果未完成,则将再次启动同一个worker,当导出完成时,将更新数据库中的用户状态列。问题是,即使导出到外部API成功,UserExportStatusWorker也没有更新数据库中的用户。但当我将代码更改为以下内容时:

class UserExportWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_id)
    # code that exports user to external service via API
    UserExportStatusWorker.new.perform(user_export_id, user_id)
  end
end

class UserExportStatusWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_export_id, user_id)
    # code that check if exporting user to external service via API is finished
    if export.completed?
      user.update(status: 'exported')
    else
      UserExportStatusWorker.new.perform(user_export_id, user_id)
    end
  end
end

我完全没有主意了。。。为什么不起作用?

理想情况下,要在工作进程上重新启动,您应该引发一个错误,并让sidekiq重试,如中所述


因此,在您的UserExportWorker类中,您可以有一个方法来检查导出是否成功运行,如果没有成功,则引发一个自定义ExportNotSuccessfulError

是,第二个示例工作正常。。。不,他们没有。在第二个示例中,我使用new.perform而不是perfrom_inare,您在
UserExportStatusWorker
中的某些作业将与
perform_一起排队在
中?在sidekiq中,我有一个可视化的UI,可以提供有关当前作业的信息。当我在中使用perform_时,我在sidekiq管理面板中看到作业计划在1分钟内完成。但这一切都不会发生。作业从计划作业中消失,但成功完成作业的计数器未更改如果您未使用错误处理服务,我建议您临时设置
retry:true
,并查看UI中的重试队列,以查看作业是否失败。我使用rollbar,但他推荐了一些-@Anthony,当我在UserExportStatusWorker中将unique更改为false时,一切都按预期进行。