我正在尝试为Rails中的预订建立一个参考号。我正在使用
strftime
表示引用号并连接一些字符串。我使用Sidekiq作为后台工作执行此操作但后来与结果混淆,因为它在def to_reserve
venue = Venue.find(params[:id])
venue_name = venue.name.delete(' ')
reference_number = ReferencesNumberWorker.perform_in(5.seconds, venue_name)
................
end
中给出了不同的值。
class ReferencesNumberWorker
include Sidekiq::Worker
def perform(venue_name)
reference_number = DateTime.now.strftime('Y%m%d%H%M%S')
return venue_name + reference_number
end
end
Sidekiq:
HotelMatt67fb02cb5da7871f92347df9
这是一个示例结果:
{{1}}
我没想到会得到正确的结果。
答案 0 :(得分:2)
将Sidekiq作业的哈希值附加到您的参考号,您希望它附加Sidekiq结果的返回值。
基本上这个方法
def to_reserve
venue = Venue.find(params[:id])
venue_name = venue.name.delete(' ')
reference_number = ReferencesNumberWorker.perform_in(5.seconds, venue_name) <- This line will return Sidekiq job number, not the actual result from Sidekiq perform operation.
................
end
当你定义参考号时,你会假设它会给你Sidekiq的回报,但它不会。这是后台工作的基本点。您将Sidekiq作业与您正在执行的操作断开连接,即卸载到单独的进程。因此,您不能期望返回,您将该方法卸载到Sidekiq。 Sidekiq的回报基本上是工作号码。
如果您希望这一点工作,那么将您在to_reserve
方法中执行的参考编号计算移动到Sidekiq,或者如果必须在Sidekiq中完成,则移动{{1}的所有逻辑到Sidekiq的to_reserve
方法。
另请注意,要使用Sidekiq,您应该传递(到Sidekiq)对象的ID,以便您可以在Sidekiq中查找它并对该对象执行一些幂等操作。在我看来,我不认为在这种情况下你需要使用Sidekiq。它不必要的复杂性,但每个人都有自己的复杂性。
旁注:优先于DateTime的时间类(perform
与Time#now
)来计算DateTime#now
方法。它是一个纯Ruby方法,比DateTime类(一个已知的性能瓶颈)更快。您的代码也不会对Rails有很强的依赖性。