2016-10-26 5 views
0

나는 토끼의 메시지를 처리 ​​중입니다. rabbitMQ에서 메시지가 손실되는 것을 방지하기 위해 나는 rabbitMQ를 사용하고 있습니다. 테스트 목적을 위해 나는 단지 내가 rabbitMQ에 응답을 돌려 준 코드 바로 전에 예외를 발생시켰다. 내가 작성한 코드에 따라 rabbitMQ는 큐에서 메시지를 삭제해서는 안된다. 즉, 코드에서 "c.ack (delivery_info.delivery_tag)"이 실행된다. 다음은RabbitMq (토끼) : 대기열에서 메시지를 삭제하는 Rabbitmq. 인정이 작동하지 않음

begin 
MessageService.with_channel do |c| 
    queue = c.queue(QUEUE_NAME, :durable => true) 
    exchange = c.topic(TOPIC_NAME, :durable => true) 
    queue.bind(exchange, :routing_key => "#{ROUTING_KEY_PREFIX}.#") 
    available_messages = queue.message_count 
    processed_messages = 0 
    fact_object = {} 
    while queue.message_count > 0 && processed_messages <= message_limit 
    queue.pop(:manual_ack => true) do |delivery_info, properties, payload| 
     rad_exam_hash_object = JSON.parse(payload) 
     entity_manager,criteria = self.query_revenue_cost_calculation(rad_exam_hash_object) 
     fact_object = self.revenue_cost_calculation_result(entity_manager,criteria) 
     self.insert_data_into_table(fact_object) 
     raise "exception" 
     c.ack(delivery_info.delivery_tag) 
    end 
    processed_messages = processed_messages + 1 
    available_messages = processed_messages - 1 
    end 
    [processed_messages, available_messages,fact_object] 
end 
rescue 
    puts "got exception while processing messages" 
end 

가 rabbitMQ가 라인 "c.ack (delivery_info.delivery_tag)이"실행되지 않은 경우에도 대기열에서 메시지를 삭제하는 이유 undestnding에서 저를 도와주세요 내 코드입니다.

답변

0

면책 조항 : 나는 루비를 모른다. 메시지 큐에서 삭제 : 메시지 TTL이 만료되면 그들이

  • 을 인정하는 경우 큐가
  • 을 삭제

    • 합니다.

    그럼 그게 아니라면 어쩌면 pop이 작동하는 것일 수 있습니다. AMQP는 get이고 (튜토리얼을 기반으로합니다) subscribe AMQP는 consume입니다.