我正在使用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以及所有其他相关的宝石,如果有帮助的话。
感谢您的所有意见。
答案 0 :(得分:0)
你应该因为创造“swoopo-style”拍卖而受到抨击,我觉得很难帮助你。
after_create()之后调用 对没有的新对象进行Base.save 已保存(不存在记录)
所以after_create有点用词不当 - 记录还没有真正创建。
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002142
你可以添加你自己的id字段,并让工作过程在db中搜索该id,每次找不到它时都会休息几秒钟(达到预设的故障限制)。
或者 - 您可以尝试在数据库更新后调用的github上的几个after_commit插件之一。
这是一个: