以下是我从Queue发送邮件的代码:
def initialize
@messages = Queue.new
end
def send_messages_from_queue
while msg = @messages.pop(true)
#Pushing data through websocket
end
rescue ThreadError
#raised if queue is empty
end
它有效但有一个缺点:如果没有频道订阅者,则消息不会被发送但仍然从Queue
中删除,因此会丢失。
如何从队列中获取最后一条消息,但在发送之前不要将其从中删除?
我可以公开内部队列:
@messages.class.module_eval { attr_reader :que }
或
@messages.define_singleton_method(:first_message) do
@que.first
end
但这不是正确的方法,也有其自身的缺点:
当我使用pop
在一个线程中从队列中取出一条消息时,几毫秒后它将无法用于其他线程,但是当我使用自定义first_message
方法时,在我致电pop
之前,该消息将可用于任何其他线程。