Внешний активатор Service Broker ... активировать на 2 очереди? - PullRequest
0 голосов
/ 19 февраля 2011

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

Когда я редактирую EAService.config, чтобы активировать очередь # 1, она работает просто отлично.
Когда я редактирую EAService.config, чтобы активировать очередь № 2, она работает просто отлично.

Если я поставлю оба в конфигурации, активируется только тот, который указан первым.

Обе очереди фактически обрабатываются одним и тем же exe-файлом ... и пример того, что не работает, это ...

<NotificationServiceList>
    <NotificationService name="my_notif_svc1" id="100" enabled="true">
      <Description>my notification service 1</Description>
      <ConnectionString>
        <Unencrypted>server=my_pc01;database=my_db;Application Name=External Activator;Integrated Security=true;</Unencrypted>
      </ConnectionString>
    </NotificationService>
    <NotificationService name="my_notif_svc2" id="100" enabled="true">
      <Description>my notification service 2</Description>
      <ConnectionString>
        <Unencrypted>server=my_pc01;database=my_db;Application Name=External Activator;Integrated Security=true;</Unencrypted>
      </ConnectionString>
    </NotificationService>
  </NotificationServiceList>
  <ApplicationServiceList>
    <ApplicationService name="myMessageApp1" enabled="true">
      <OnNotification>
        <ServerName>my_pc01</ServerName>
        <DatabaseName>my_db</DatabaseName>
        <SchemaName>dbo</SchemaName>
        <QueueName>my_user_queue1</QueueName>
      </OnNotification>
      <LaunchInfo>
        <ImagePath>c:\test\myMessageReceiver.exe</ImagePath>
        <CmdLineArgs>whatever cmd-line arguments you need to pass to your receiver application</CmdLineArgs>
        <WorkDir>c:\test</WorkDir>
      </LaunchInfo>
      <Concurrency min="1" max="4" />
    </ApplicationService>
    <ApplicationService name="myMessageApp2" enabled="true">
      <OnNotification>
        <ServerName>my_pc01</ServerName>
        <DatabaseName>my_db</DatabaseName>
        <SchemaName>dbo</SchemaName>
        <QueueName>my_user_queue2</QueueName>
      </OnNotification>
      <LaunchInfo>
        <ImagePath>c:\test\myMessageReceiver.exe</ImagePath>
        <CmdLineArgs>whatever cmd-line arguments you need to pass to your receiver application</CmdLineArgs>
        <WorkDir>c:\test</WorkDir>
      </LaunchInfo>
      <Concurrency min="1" max="4" />
    </ApplicationService>
  </ApplicationServiceList>

кроме того, я не понимаю, что делает id = "100" ... Я пытался иметь одинаковые # и разные # ... т.е. 100 и 101, но это не имело значения. Служба активатора работает только для первой из перечисленных в «ApplicationServiceList»

помощь!

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Я разобрался в своей проблеме ...

Из документации

Системы могут использовать внешнюю активацию для нескольких сервисных брокеров очереди приложений. Eсть отношения многих к одному очереди приложений и активация услуги уведомления. Eсть отношения один-к-одному между Служба уведомлений об активации и Служба внешней активации.

У меня было две службы уведомлений (my_notif_svc1 и my_notif_svc2), перечисленные выше. Я переключил свои уведомления о событиях (создать уведомления о событиях ...), чтобы использовать тот же «TO SERVICE», и теперь он работает.

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

Я все еще думаю, что способ, которым я это настроил, должен работать, но это определенно работает ...

0 голосов
/ 23 апреля 2011

Я также столкнулся с этой же проблемой, и было бы неплохо получить официальный ответ от Microsoft о том, почему и если они будут соблюдать несколько служб уведомлений, перечисленных в SSBEA, а не только первый в списке. В конце мы пошли с тем же решением, и вот полезный фрагмент, который можно использовать для динамического получения Guid и настройки события активации очереди для SINGLE-службы (ServiceBrokerNotification.NotificationService).

<code>DECLARE @sbn nvarchar(100) = 'servicebrokernotification'
DECLARE @sbnid nvarchar(60)</p>

<p>SELECT @sbnid = ''''+CAST(service_broker_guid AS nvarchar(60))+'''' FROM sys.databases WHERE name = @sbn
SELECT @sbnid</p>

<p>DECLARE @Str nvarchar(max)
DECLARE @createEventSql nvarchar(max)</p>

<p>Set @Str = 'CREATE EVENT NOTIFICATION NotificationEvent ON QUEUE [TargetQueue] 
FOR QUEUE_ACTIVATION TO SERVICE ''NotificationService'' ,' + @sbnid;</p>

<p>Select @Str 
EXECUTE (@Str)
...