every 1.minute do
runner "DailyNotificationChecker.send_notifications"
end
这是每当gem调度程序
class DailyNotificationChecker
def self.send_notifications
puts "Triggered send_notifications"
expiry_time = Time.now + 57
while (Time.now < expiry_time)
if RUN_SCHEDULER == "true" || RUN_SCHEDULER == true
process_notes
end
sleep 4 #seconds
end
end
def self.process_notes
notes = nil
time = Benchmark.measure do
Note.uncached do
notes = Note.within_2_mins.unprocessed
if notes.present?
note_ids = notes.pluck(:id)
note_hash = {}
note_hash[:note_ids] = note_ids.to_json
url = URI.parse(PROCESS_NOTE_API_URL)
resp, data = Net::HTTP.post_form(url, note_hash)
notes.each do |note|
puts "note_id = #{note.id}"
puts "processed #{note.processed}"
RealtimeNotificationChecker.perform_async(note.user_id,"note_created","TempUserNote",note.id)
end
end
end
end
puts "time #{time}"
end
end
我的目的是尝试运行实时通知。如果用户在应用程序中创建了一个笔记,那么我会在4秒内向他发送推送通知。
所以我每1分钟运行一次cron作业,然后点击send_notifications
课程中的方法DailyNotificationChecker
。现在这应该每4秒运行一次方法process_notes。创建的每个新音符都设置为processed = 0 flag。并且我检索每个不超过2分钟的未处理标志并对其执行操作。
行
note_ids = notes.pluck(:id)
note_hash = {}
note_hash[:note_ids] = note_ids.to_json
url = URI.parse(PROCESS_NOTE_API_URL)
resp, data = Net::HTTP.post_form(url, note_hash)
获取所有未处理的note_ids并将它们发送到主服务器以标记它们处理= 1,以便在接下来的4秒内点击这些注释不再来到处理列表。
然后我循环每个音符并在后台发送它们以发送推送通知
notes.each do |note|
RealtimeNotificationChecker.perform_async(note.user_id,"note_created","TempUserNote",note.id)
end
但我想这里有些不对劲。当我有2个以上的笔记要处理时,它不会向所有用户发送通知。
有人可以提出错误并要求
注意: 我可能会在4秒内处理超过10-15个音符。 我正在使用sucker punch gem进行后台工作。