2012-11-29 3 views
5

Io uso RabbitMQ Web-STOMP nel mio progetto ed è molto buono per me, ma c'è un problema con esso. Quando il consumatore si iscrive a una coda riceve istantaneamente tutti i messaggi dalla coda. Nel mio caso, un'attività di un messaggio può richiedere molto tempo ed è necessario che il consumatore riceva il messaggio successivo da una coda solo quando il precedente è stato completato.Esiste un modo per RabbitMQ STOMP di interrompere il consumo di messaggi fino a quando il precedente sarà ACKed?

Tutto funziona correttamente, quando la pubblicazione viene avviata dopo che gli utenti sono stati abbonati, ma quando ci sono già messaggi in una coda, il primo utente iscritto riceverà tutti e altri resteranno liberi. C'è qualcosa come il metodo queue.shift() di node-amqp per consumare il messaggio successivo solo quando il precedente è ACKed?

risposta

4

(? Quale client stai usando)

La risposta alla tua domanda è basic_qos, vedere amqp reference e cercare basic.qos

In C# API si dovrebbe effettuare le seguenti operazioni:

int prefetch = 10; 

IModel channel = connection.CreateModel(); //where connection is IConnection 
channel.basic_qos(0, prefetch, false); 

La dimensione di precaricamento può essere utilizzata per comunicare al server rabbitmq quanti messaggi inviare al cliente fino a quando non vengono ACK. La dimensione di prefetch viene ignorata se è impostata l'opzione NO-ACK.

Tenere presente che questo valore può avere un impatto potenziale sulle prestazioni, dare un'occhiata a this.

+0

Uso RabbitMQ Web - ** STOMP ** con browser JS. So già come gestirlo utilizzando C# o anche node.js, ma c'è un abile QoS per STOMP? –

+1

Impostazione prefetch: 1 CONNECT header e ack: l'intestazione del client per SUBSCRIBE non funziona per me ... –

+1

Dove erano i miei occhi! Ovviamente, "prefetch-count": 1 intestazione per SUBSCRIBE è la risposta, grazie! –