2013-02-12 2 views
0

에서 같은 큐에 요청을 다시 전송 : 나는 그것이 실용적이지 알고내가 RabbitMQ 큐 소비하는 루비 과정이 RabbitMQ와 루비

AMQP.start(:host => $AMQP_URL) do |connection| 
    @channel ||= AMQP::Channel.new(connection) 
    @queue ||= @channel.queue("results") 

    @queue.subscribe do |body| 
    puts "Received -> #{body}"  
    # Publish the same message again to the same queue 
    end 
end 

을,하지만 난 게시 할 예정입니다 방법을 알고 싶어요 같은 메시지를 동일한 큐에 보내면 직접 채널로 나를 위해 작동하지 않습니다. 어쨌든 메시지를 지우지 않고 큐에 보관하거나 그냥 msg를 다시 게시하면 큰 메시지가됩니다.

아이디어가 있으십니까?

답변

1

그냥 부정 확인과 메시지를 거부하는 것입니다 수행하는 가장 적절한 방법은, 그것은 자동으로 다시 대기열됩니다

@queue.subscribe do |metadata, payload| 
    # reject and requeue 
    channel.reject(metadata.delivery_tag, true) 
end 

어쨌든, 당신은 수동으로 게시하고 싶은 경우 "메타 데이터" 매개 변수를 사용하면 필요한 모든 정보를 얻을 수 있습니다.

+0

나는 여기에 도움을 주려는 우물에 정말 감사하지만이 방법으로는 페이로드를 인쇄하는 약도가 있어야한다고 생각했지만이 방법으로는 작동하지 않았다. msg를 대기열에 보관하고 계속 액세스하십시오. –

+0

@Loris가 제공하는 응답은 정확합니다. 메시지를 대기열에 보관하려면 거부해야합니다. 그러나 나는 이것이 상당히 엉망인 것처럼 당신이 아마 당신의 디자인을 다시 생각할 필요가 있다고 말할 것이다. – kzhen

+0

직관적으로 나는 직접적인 대기열에서 메시지를 거절하는 것이 아니라 애플리케이션 로그에서 실패 통계를 컴파일하는 것과 대조적으로 실패를 등록하는 데 사용되어 관리 콘솔에서 이벤트를 볼 수 있습니다. . 콘솔의 여러 섹션을 살펴보면 확인되지 않았거나 승인되지 않은 메일에 대한 장소 소유자가 표시되지만 메시지 거부를 나타내는 내용은 표시되지 않습니다. 통계적으로 거부가 관리 상으로는 수집되지 않고 대기열에 다시 대기시킬 필요가없는 경우 ack는 거부 (false)와 동일한 기능을 제공하는 것으로 보입니다. –