Sì, sono d'accordo che questo è uno svantaggio principale dell'attuale implementazione del client RabbitMQ. Ho usato RMQ per circa 2 anni (la libreria .NET), e non molto è cambiato a riguardo in quel momento. Deve essere completamente riscritto da zero e non ho ancora avuto il tempo di farlo.
Ma io ho alcune indicazioni. Per prima cosa creerei una classe wrapper per la connessione/oggetto canale (è necessario che il canale esegua le operazioni AMQP, l'unica cosa per cui la connessione è utilizzata è creare canali). Quindi, la classe wrapper può tenere traccia di se il canale o la connessione è aperta e agire di conseguenza.
Il mio codice finisce per assomigliare a questo:
while (_iNeedToBeSendingAndReceiving) {
try {
//This blocks indefinitely while waiting for a connection.
using (var channel = ConnectionWrapper.CreateChannel(string connectionString) {
//Do stuff, blah, blah
//When the connection or channel closes, an exception is thrown and
//I move to the catch block.
}
catch(ConnectionInterruptException ex) {
//Eat, yummy!
}
}
mio eventuale piano è quello di astratto, anche questa roba via, e creare un modo completamente nuovo di interagire con il RabbitMQ (o qualsiasi altro messaggistica) libreria. Ti farò sapere quando avrò lavorato su questo, potrebbe essere un paio di mesi.
Non sono sicuro di seguire il problema relativo ai canali. Sono come connessioni lite. Quindi, se ti disconnetti, perderai anche i tuoi canali. – robthewolf
Lo hai mai capito? O hai scritto il tuo livello di ricollegamento automatico? Qualche possibilità che tu condivida? – StFS
@StFS Ho scritto un livello di riconnessione molto * kludgey *.Non è particolarmente facile per me aprire l'open source a questo punto, ma sarei felice di consigliarlo - pubblica una domanda su programmers.SE chiedendo aiuto per progettare questo livello e ti risponderò. – djechlin