Служба WCF с привязкой msmq и closeTimeout? - PullRequest
1 голос
/ 15 февраля 2010

Я работаю над тем, чтобы ускорить большое количество интеграционных тестов в нашей среде.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что во время разрыва между тестами одна служба WCF, использующая привязку msmq, закрывается примерно за 1 минуту.

В процессе разрыва, который мы зацикливаем на наших сервис-хостах, вызываем метод Close () с очень коротким тайм-аутом, переопределяя значение closeTimeout в конфигурации WCF. Это хорошо работает для привязок net.tcp, но одной службе, которая использует msmq, все еще требуется 1 минута для закрытия. Кажется, что closeTimeout не имеет никакого эффекта.

Конфиг для тестовой службы выглядит следующим образом:

<netMsmqBinding>
    <binding name="NoMSMQSecurity" closeTimeout="00:00:01" timeToLive="00:00:05" 
             receiveErrorHandling="Drop" maxRetryCycles="2" retryCycleDelay="00:00:01" receiveRetryCount="2">
      <security mode="None" />
    </binding>
  </netMsmqBinding>

И заключительный звонок, который я использую, прямо так:

service.Close(new TimeSpan(0, 0, 0, 0, 10));

Есть ли другой способ, чтобы я мог быстрее закрыть сервис-хост?

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

С уважением,

За Салми

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

Я нашел причину отложенного закрытия хоста службы с помощью Msmq.

Кажется, причина длительного закрытия заключается в том, что служба использует другую службу, основанную на net.tcp, у которой активирован надежный сеанс и узел службы. В параметрах надежного сеанса время ожидания неактивности установлено равным 5 минутам, что заставляет его отправлять сообщения инфраструктуры поддержки активности, их следует отправлять каждые 2,5 минуты. Этот интервал обмена сообщениями о поддержании активности, по-видимому, заставляет службу, основанную на msmq, зависать в течение 1-2 минут, вероятно, ожидая прибытия некоторых сообщений о поддержании активности.

Когда я устанавливаю значение inactivityTimeout на 5 секунд, завершение работы службы msmq завершается примерно через 2,5 секунды. Это делает автоматические интеграционные тесты намного быстрее!

0 голосов
/ 16 февраля 2010

Может быть какая-то транзакция, которая блокирует закрытие.

Скажем, например, что есть открытая транзакция, если вы закрываете ее без фиксации транзакции, то она будет ждать 1 минуту, пока транзакция не прекратит работу, прежде чем она сможет закрыться.

...