2017-07-03 161 views
1
channel.basicQos(1); 

while (true) { 
    GetResponse res = channel.basicGet(TEST_QUEUE, false); 
    if (res != null) { 
     deliveryTag = res.getEnvelope().getDeliveryTag(); 
    } 

    // Handle all messages If the condition is true 
    if (condition) { 
     // nack all messages unhandled previously 
     channel.basicNack(deliveryTag - 1, true, true); 

     // ack current message only 
     channel.basicAck(deliveryTag, false); 
    } 
    else { 
     // Do not handle current message and continue to get next one 
    }   
} 

Q1。
我不確定如果我可以同時使用nack和ack。
我可以使用deliveryTag - 1來表示以前的所有消息嗎?Nack當前消息和Ack當前消息(rabbitmq,java)之前的所有消息

總之,我想跳過所有不符合條件的消息。
如果當前消息符合條件,那麼消除所有跳過的消息並確認當前消息。
通過這樣做,我想延遲處理一些特定的消息。 Q2302。
恐怕如果我寫作while(true)並且有多個工作人員在運行,那麼channel.basicQos(1)將無法按預期工作。
我應該編寫這樣的代碼來限制計數嗎?或者我應該如何編寫以確保所有其他工作人員均勻地收到郵件?

int prefetch = 1; 
int count = 0; 
while (count++ <= prefetch) { 
} 

Q3。
我注意到只要連接處於打開狀態,工作程序就不會終止。
連接將會打開多久,我是否需要手動關閉它?

最後, 的RabbitMQ Java客戶端API和AmqpTemplate VS RabbitTemplate哪一個更適合在該情況下(不使用了MessageListener(ChannelAwareMessageListener)模型)?

回答

0

Q1 - 它應該可以正常工作。你嘗試過它並發現問題嗎?是的,標籤每次遞送都會遞增。

Q2 - basicQosbasicGet()沒有關係 - 僅與basicConsume()一起使用。

問題3 - 完成後需要關閉連接。

最後;這取決於。如果你想Spring的更高級別的支持(消息轉換等),然後使用它;如果你想處理原始數據API,不要使用Spring。

RabbitTemplate不直接支持basicGet與用戶管理acks/nacks,除了通過其execute方法與通道回調。