Использование msmq и wcf - PullRequest
       10

Использование msmq и wcf

3 голосов
/ 03 апреля 2010

Я уже писал этот вопрос сообщение?

Начал читать на wcf и msmq.

Мой первый вопрос был бы - скажем, у меня в очереди 100 сообщений, как бы я сказал, чтобы моя служба начала работать с каждым сообщением асинхронно, чтобы он работал с несколькими сообщениями одновременно. это вообще возможно или это всегда синхронная операция?

Обновление: Допустим, моя система такова, что у меня есть удаленные места / серверы, на которые также загружаются файлы. Вся моя обработка происходит в центральном месте. Будут ли использоваться msmq и wcf, при этом все файлы из удаленных мест будут скопированы в центральное место. Сообщения могут подаваться приложением, отслеживающим БД, и, как только оно определяет, что файл должен быть скопирован, оно отправляет сообщение, полученное службой wcf, и копирует файл из удаленного в центральное местоположение.

Поскольку это выделенная сеть, файл будет доступен по unc-путям. Я знаю, что мои клиенты будут склонны сделать это в какой-то момент и пытаются определить, возможно ли это, учитывая объем файла и требования одновременного копирования файлов.

Я предложил БИТЫ, но клиенту неудобно с БИТами из-за политики с их отделом ИТ.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Код на стороне сервера WCF будет контролироваться настройками регулирования сервиса в config. По умолчанию для каждого запроса (сообщения в очереди) создается экземпляр класса обслуживания для обработки сообщения.

WCF на стороне сервера ServiceHost будет обрабатывать это управление за вас - никакой специальной обработки с вашей стороны не требуется.

Регулирование сервиса может управляться поведением serviceThrottling. Прочтите этот превосходный пост в блоге Дэна Ригсби , в котором подробно описано, как настроить регулирование в конфигурации.

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="throttled">
                <serviceThrottling
                    maxConcurrentCalls="16"
                    maxConcurrentInstances="2147483647"
                    maxConcurrentSessions="10"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Наиболее важными настройками будут maxConcurrentCalls - они определяют, сколько одновременных вызовов будет обрабатываться вашей службой WCF.

Вам также следует ознакомиться с этим сообщением в блоге здесь , в котором показано, как использовать MSMQ + WCF и как это отличается от прямого MSMQ и WCF-over-HTTP. Отличное вступление, отличное видео.

1 голос
/ 03 апреля 2010

Очередь (как следует из названия) содержит линейную очередь объектов. Вы должны снять одну, прежде чем сможете взять следующую.

Вы можете создать обработчик события receiveCompleted для удаления объекта из очереди и передачи его другому компоненту для обработки

qq.ReceiveCompleted += new ReceiveCompletedEventHandler(qq_ReceiveCompleted);
qq.BeginReceive();

static void qq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
   //DO SOMETHING WITH e.Message.Body e.g. Start a seperate thread which processes the object.

   // Listen for the next message.
   queue.BeginReceive();
}
...