2011-11-04 18 views
7

Sto provando a scrivere un servizio wcf che funziona tramite l'associazione rabbitMQ. Sono riuscito a creare un server e un client con successo e il client ha inviato messaggi al server tramite la coda. Sono confuso su 2 numeri.RabbitMQ con WCF e una coda persistente

  1. Non appena il servizio viene arrestato, la coda viene cancellata. C'è un modo per configurare wcf e rabbitMQ in modo che la coda sia persistente? In questo modo non devo preoccuparmi di perdere dati se il mio server si blocca.

  2. Non riesco a controllare il nome della coda. Quando corro rabbitmqctl.bat list_queues vedo che la coda si chiama amq.gen-3IgZD30XvTEQWNRsezSUUA==. C'è un modo per controllare il nome della coda?

risposta

9

Ciò non può essere eseguito con le associazioni WCF. Vedi il thread della mailing list this per i dettagli.

In sostanza, non si può controllare il nome della coda tramite WCF, che significa che si sono limitati a anonimi code (come quella che state vedendo), che, a sua volta, significa che è possibile utilizzare solo non persistenti code.

Se è necessario un controllo maggiore di quello offerto dai collegamenti WCF, è consigliabile utilizzare il client .NET completo. È abbastanza facile da usare e ci sono un po 'di tutorials per aiutarti a iniziare (sono in Java, ma l'API .NET è molto simile).

+4

Grazie. Questa è la risposta che stavo cercando. In pratica rende inutile persino avere un binding WCF per rabbitMQ se non può darti questo controllo. –

5

Ho avuto lo stesso problema come hai fatto e quello che ho fatto è stato modificare il codice sorgente del coniglioMQDotNetClient.

File: RabbitMQInputChannel.cs

public override void Open(TimeSpan timeout) 
    {    
     if (State != CommunicationState.Created && State != CommunicationState.Closed) 
      throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State)); 

     OnOpening(); 
#if VERBOSE 
     DebugHelper.Start(); 
#endif 
     //Create a queue for messages destined to this service, bind it to the service URI routing key 
#if USE_DEFINED_QUEUE_NAMES 
     //here we create a queue that uses the name given in the service address in the wcf binding. 
     //if the address in the web.config is: soap.amq:///QueueName 
     //the name of the queue will be: QueueName 
     //LVV 
     string queue = m_model.QueueDeclare(base.LocalAddress.Uri.PathAndQuery, true, false, false, null); 
#else 
     string queue = m_model.QueueDeclare(); 
#endif 
     m_model.QueueBind(queue, Exchange, base.LocalAddress.Uri.PathAndQuery, null); 

     //Listen to the queue 
     m_messageQueue = new QueueingBasicConsumer(m_model); 
     m_model.BasicConsume(queue, false, m_messageQueue); 

#if VERBOSE 
     DebugHelper.Stop(" ## In.Channel.Open {{\n\tAddress={1}, \n\tTime={0}ms}}.", LocalAddress.Uri.PathAndQuery); 
#endif 
     OnOpened(); 
    } 

compilare con l'USE_DEFINED_QUEUE_NAMES bandiera. Questo creerà un nome di coda con il nome che hai dato nel tuo file app.config o web.config. Puoi sempre modificare le opzioni delle code su QueueDeclare (...) se vuoi che le tue code si comportino diversamente da quelle che sto creando. Cheers!

Problemi correlati