如何在一次迭代后终止EventMachine?

时间:2014-03-21 18:49:10

标签: ruby rabbitmq eventmachine

我想将消息发布到直接交换,所以我有以下功能:

def publish_message_to_direct(server_params, exchange, payload)
    AMQP.start(server_params) do |connection|
        channel  = AMQP::Channel.new(connection)
        exchange = channel.direct(exchange,:durable=>true)
        exchange.publish(payload)
        puts payload
        connection.close do
            EM.stop { exit }
        end
    end
end

调用该函数后,它会将有效负载打印到终端,但不会将消息发布到交换机。但是,如果我添加这样的SIGTRAP,那么它会发布消息:

.
.
.
            Signal.trap("INT") do 
                connection.close do
                    EM.stop { exit }
                end
            end

如何让EM停止而不必发送此信号? IOW,我只是希望它发布消息并返回。

1 个答案:

答案 0 :(得分:0)

好吧,我刚刚阅读了文档并找到了publishing one-off messages上的部分:

所以现在的代码如下:

def publish_message_to_direct(server_params, exchange, payload)
    AMQP.start(server_params) do |connection|
        channel  = AMQP::Channel.new(connection)
        exchange = channel.direct(exchange,:durable=>true)
        exchange.publish(payload, :nowait => false) do              
            puts payload
            connection.close do
                EM.stop
            end
        end
    end
end

显然,不同之处在于在传递给发布函数的块中添加了关闭事件并使用选项:nowait => false。希望这能帮助其他人解决同样的问题。