我正在为发出回调的Restful应用程序创建一个基于ruby的回调侦听器工具,这样我就可以访问所发出的回调,比如RequestBin。对于后端,我有MongoDB,其中我有一个主文档,每个会话创建一个可重用的桶来监听请求,我有一个嵌入式文档,每个请求都填充。
class Bin
include Mongoid::Document
include Mongoid::Timestamps
embeds_many :callbacks
field :bin_id, type: String
end
class Callback
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :bin, :inverse_of => :bins
field :callback_id, type: Integer
field :http_method, type: String
field :params, type: String
field :headers, type: String
field :raw_post, type: String
end
我的问题是有没有办法监听MongoDB中回调文件的插入?
我在互联网上环顾四周,发现MongoDB具有所谓的capped collections
和tailable cursors
,它允许MongoDB将数据推送到监听器。但对我来说,它不会起作用,因为我已经创建了主文档,我必须听取嵌入式文档的创建。
答案 0 :(得分:1)
答案 1 :(得分:0)
所以我最终做了以下事情,
def self.wait_for_callback(bin_id)
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
db = MongoClient.new(host, port).db('mongoid')
coll = db.collection('bins')
retries = 0
res = coll.find("bin_id" => bin_id).to_a.first
loop do
if res["callbacks"].nil? && retries < 45
sleep 5
puts "Retry: #{retries}"
retries += 1
res = coll.find("bin_id" => bin_id).to_a.first
else
return res["callbacks"].to_a.first
end
end
return nil
rescue Exception => e
@@success =false
@@errors << "Error:\n#{e.inspect}"
if $debug_flag == "debug"
puts @@errors
end
return nil
end
但这里的问题是反复查询。那么有更好的方法吗?