RabbitMQ с WCF и постоянной очередью - PullRequest
7 голосов
/ 05 ноября 2011

Я пытаюсь написать службу wcf, которая работает через привязку rabbitMQ. Мне удалось успешно создать сервер и клиент, и клиент мог отправлять сообщения на сервер через очередь. Я запутался в 2 вопросах.

  1. Как только служба закрывается, очередь удаляется. Есть ли способ настроить wcf и rabbitMQ так, чтобы очередь была постоянной? Таким образом, мне не нужно беспокоиться о потере данных в случае сбоя моего сервера.

  2. Кажется, я не могу контролировать имя очереди. Когда я запускаю rabbitmqctl.bat list_queues, я вижу, что очередь называется amq.gen-3IgZD30XvTEQWNRsezSUUA==. Есть ли способ контролировать имя очереди?

Ответы [ 2 ]

9 голосов
/ 05 ноября 2011

Этого нельзя сделать с привязками WCF. Подробности смотрите в этом списке рассылки.

По сути, вы не можете контролировать имя очереди через WCF, что означает, что вы ограничены анонимными очередями (такими, как вы видите), что, в свою очередь, означает, что вы можете использовать только непостоянные очереди.

Если вам нужно больше контроля, чем предлагается привязками WCF, вам следует рассмотреть возможность использования полного клиента .NET. Его довольно просто использовать, и есть множество учебных пособий , которые помогут вам начать работу (они на Java, но API .NET очень похожи).

5 голосов
/ 31 октября 2013

У меня была та же проблема, что и у вас, и я отредактировал исходный код rabbitMQDotNetClient.

Файл: 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();
    }

Скомпилируйте с флагом USE_DEFINED_QUEUE_NAMES. Это создаст имя очереди с именем, которое вы указали в файле app.config или web.config. Вы всегда можете изменить параметры очередей в QueueDeclare (...), если хотите, чтобы ваши очереди вели себя не так, как те, которые я создаю. Ура! * * 1006

...