【问题标题】:Workling worker cannot find newly added record工作人员找不到新添加的记录
【发布时间】:2010-02-10 00:36:41
【问题描述】:

我正在使用 Starling 和 Workling 来处理我的应用程序中的后台任务,这是一个 Swoopo 风格的拍卖网站。在这种情况下,后台任务是一个通知系统,用于监控拍卖并通知获胜者。在创建拍卖对象时调用监视器。我的问题是我的监控代码找不到它应该监控的拍卖。代码如下:

失败的单元测试:

class AuctionTest < ActiveSupport::TestCase
  test "are monitored when created" do
    auction = Auction.new(
      :name => "A TV",
      :markdown => "A large TV",
      :starting_bid => 0.01,
      :bid_increment => 0.01,
      :starts_at => Time.now(),
      :ends_at => Time.now() + 5.seconds,
      :active => true
    )
    auction.save
    Bid.place(@current_user, auction)

    sleep(10) #when bids are placed, time is added to the end of the auction so wait

    assert auction.won?
    assert_equal @current_user.id, auction.winner_id
  end
end

工人代码:

class AuctionsWorker < Workling::Base
  def monitor(options)
    active = true
    ends_at = options[:original_ends_at]
    while active
      auction = Auction.find(options[:auction_id]) #this is the record that cannot be found
      if auction.won?
        active = false
        winner = User.find(auction.high_bidder).id
        auction.update_attribute(:winner_id, winner)
      else
        until Time.now() >= ends_at
          sleep(1)
        end
      end
    end
  end
end

调用worker的代码:

class Auction < ActiveRecord::Base
  def after_create
    AuctionsWorker.asynch_monitor(:auction_id => self.id, :original_ends_at => self.ends_at) if self.active?
  end
end

每次运行测试时,我都会收到一条错误消息,告诉我无法找到提供给工作人员的拍卖。

有人有什么想法吗?如果有帮助,我会在 Mac OSX 10.6.2 Macbook Pro 上使用 rails 2.3.5、sqlite3 和最新的 Starling、Workling 以及所有其他相关的 gem。

感谢您的所有意见。

【问题讨论】:

    标签: ruby-on-rails ruby workling starling-server


    【解决方案1】:

    你应该因为创建“swoopo 式”拍卖而被否决,我为帮助你而感到肮脏。

    after_create() 之后调用 Base.save 保存在新对象上 尚未保存(不存在记录)

    所以 after_create 有点用词不当 - 记录还没有真正创建。

    http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002142

    您可以添加自己的 id 字段并让工作进程在 db 中搜索该 id,每次找不到它时休眠几秒钟(达到某个预设的失败限制)。

    或者 - 您可以尝试 github 上的几个 after_commit 插件之一,这些插件在数据库更新后被调用。

    这是一个:

    http://github.com/delynn/after_commit

    【讨论】:

    • 只要您在注册时不误导人们,我并不完全了解此类拍卖的问题。但是,错误仍然存​​在,如果我没有因我选择的应用程序而冒犯您,那么任何其他解决方案都会有很大的关联。
    • 我以前读过那篇文章。我不同意阿特伍德的观点,即这些网站是非法的,并且软件相当于撒旦本人。在我看来,它们并不比任何社交游戏平台更邪恶,这就是我打算营销它的方式。不过,在此处发布有关此特定项目的问题之前,我应该考虑更多。
    • 拍卖应该提高效率,swoopo 没有。如果您将其推销为以低价购买商品的方式,那是邪恶的。整件事的目的是从那些不明白他们会多付钱并可能一无所获的人那里榨取钱财。
    • 不过,请参阅上面的几个可能的解决方案。
    • 感谢您的帮助,klochner。
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2018-01-02
    相关资源
    最近更新 更多