none
SQL Broker External Activator - 2 Queues RRS feed

  • Frage

  • Hi,

    ich verwende den ssbea aus dem SQL 2008 Feature-Pack. Das funktioniert bislang gut. Allerdings hatten wir bisher auch nur eine Queue. Der derzeitige Stand der easervice.config ist

      <NotificationServiceList>
        <NotificationService name="ItemExternalActivatorService" id="100" enabled="true">
          <Description>My test notification service</Description>
          <ConnectionString>
            <!-- All connection string parameters except User Id and Password should be specificed here -->
            <Unencrypted>server=JUPITER\SQLSERVER;database=ELLA;Application Name=External Activator;Integrated Security=true;</Unencrypted>
          </ConnectionString>
        </NotificationService>
      </NotificationServiceList>
      <ApplicationServiceList>
        <ApplicationService name="myMessageApp" enabled="true">
          <OnNotification>
            <ServerName>JUPITER\SQLSERVER</ServerName>
            <DatabaseName>ELLA</DatabaseName>
            <SchemaName>dbo</SchemaName>
            <QueueName>ItemTargetQueue</QueueName>
          </OnNotification>
          <LaunchInfo>
            <ImagePath>c:\SQLBrokerEAProcess\SQLBrokerEAProcess.exe</ImagePath>
            <CmdLineArgs>item</CmdLineArgs>
            <WorkDir>c:\ProgramData\SQLBrokerEAProcess</WorkDir>
          </LaunchInfo>
          <Concurrency min="1" max="1" />
        </ApplicationService>
      </ApplicationServiceList>
      <LogSettings>
        <LogFilter>
        </LogFilter>
      </LogSettings>
    </Activator>

    c:\SQLBrokerEAProcess\SQLBrokerEAProcess.exe kann mit einem weitern Parameter "order" gestartet werden.

    Ich mochte nun, sobald in eine andere Tabelle Einträge eingefügt werden, dass per Trigger ein Eintrag in enie weiter Queue ("OrderTargetQueue") erfolgt und c:\SQLBrokerEAProcess\SQLBrokerEAProcess.exe mit Parameter "order" gestartet wird. Hierzu habe ich in der easervice.config folgendes zusätzlich eingefügt.

        <ApplicationService name="myMessageApp2" enabled="true">
          <OnNotification>
            <ServerName>JUPITER\SQLSERVER</ServerName>
            <DatabaseName>ELLA</DatabaseName>
            <SchemaName>dbo</SchemaName>
            <QueueName>OrderTargetQueue</QueueName>
          </OnNotification>
          <LaunchInfo>
            <ImagePath>c:\SQLBrokerEAProcess\SQLBrokerEAProcess.exe</ImagePath>
            <CmdLineArgs>order</CmdLineArgs>
            <WorkDir>c:\ProgramData\SQLBrokerEAProcess</WorkDir>
          </LaunchInfo>
          <Concurrency min="1" max="1" />
        </ApplicationService>

    Problem:

    Wie schaffe ich es, dass "ItemExternalActivatorService" auf beide Queues reagiert? Oder ganz anders?

    Bis jetzt habe ich Message Type, Queue und Contract analog zum funktionierenden Message Type, Queue und Contract erstellt. Ich erhalte aber im eatrace.log den Fehler:

    "AUSNAHME    FEHLER = 32, Für die Warteschlange '[JUPITER\SQLSERVER].[ELLA].[dbo].[OrderTargetQueue]' gibt es keine aktivierte Anwendungsüberwachung."

    Kann mich einer in die richtige Richtung stoßen?

    Danke

    Volker



    Und Abends ein Glas Wein von AMAVINO

    Dienstag, 27. Mai 2014 16:32

Alle Antworten

  • Hallo Volker,

    ich nutze auch gerne den EA, habe bisher aber nicht den Fall, das zwei Queue's überwacht werden musst. Ich habe mal testweise eine Überwachung auf Prod + Test System eingerichtet nach Manier

    <ApplicationServiceList>
        <ApplicationService name="AppProd" enabled="true">
           ....
        </ApplicationService>
        <ApplicationService name="AppDev" enabled="true">
           ....
        </ApplicationService>
    </ApplicationServiceList>

    der EA ließ sich problemlos starten und es gab auch keine Fehlermeldungen im Log. Hast Du für die zweite Queue auch eine Notification Service und Event Notification eingerichtet? Die Meldung hört sich danach an, das die fehlt und in Deiner Auflistung ist es auch nicht aufgeführt (was nichts heißen will).


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 28. Mai 2014 09:38

  • Hallo Olaf,

    das habe ich augeführt:

    CREATE MESSAGE TYPE [http://jupiter.straehle.local/SQL/OrderRequestMessage] VALIDATION = NONE 
    
    CREATE MESSAGE TYPE [http://jupiter.straehle.local/SQL/OrderResponseMessage] VALIDATION = NONE
    
    ALTER MESSAGE TYPE [http://jupiter.straehle.local/SQL/OrderRequestMessage] VALIDATION = WELL_FORMED_XML 
    
    ALTER MESSAGE TYPE [http://jupiter.straehle.local/SQL/OrderResponseMessage] VALIDATION = WELL_FORMED_XML
    
    CREATE CONTRACT [http://jupiter.straehle.local/SQL/OrderContract]
      ( [http://jupiter.straehle.local/SQL/OrderRequestMessage] SENT BY INITIATOR,
        [http://jupiter.straehle.local/SQL/OrderResponseMessage] SENT BY TARGET)
    
    CREATE QUEUE OrderInitiatorQueue
       WITH STATUS = ON 
    
    CREATE QUEUE OrderTargetQueue
       WITH STATUS = ON 
    
    CREATE SERVICE OrderInitiatorService
       ON QUEUE OrderInitiatorQueue
       (
       [http://jupiter.straehle.local/SQL/OrderContract]
       )
       
    CREATE SERVICE OrderTargetService
       ON QUEUE OrderTargetQueue
       (
       [http://jupiter.straehle.local/SQL/OrderContract]
       )
       
    
    ALTER QUEUE OrderTargetQueue
    	WITH ACTIVATION (DROP)
    GO
    
    CREATE EVENT NOTIFICATION OrderEventNotificationTargetQueue
    	ON QUEUE OrderTargetQueue
    	FOR QUEUE_ACTIVATION
    	TO SERVICE 'ItemExternalActivatorService', 'current database';
    GO
    

    Mein Kenntnisstand ist, dass ich in der NotificationServiceList nur einen Eintrag NotificationService angeben kann. Der ist aber schon mit ItemExternalActivatorService für meine ItemTargetQueue belegt.

    Ich hol noch mal weiter aus.
    es gibt 2 Tabellen in der Datenbank (item und order). Bei beiden werden Trigger beim Einfügen/Ändern ausgeführt, die dann in eine jeweils eigene Queue ItemTargetQueue und OrderTargetQueue) schreiben. Beide Queue sollen nun vom EAService überwacht und die Ausführung dann a ein Programm weitergegeben werden. Habe ich eine Denkfehler?


    Und Abends ein Glas Wein von AMAVINO

    Mittwoch, 28. Mai 2014 10:04
  • Laut EAServiceConfig.xsd

      <xs:element name="Activator" type="activatorType"/>
      <xs:complexType name="activatorType">
        <xs:sequence>
          <xs:element name="NotificationServiceList">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="NotificationService" type="notificationServiceType" minOccurs="1" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="ApplicationServiceList">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="ApplicationService" type="applicationServiceType" minOccurs="1" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
    

    kannst Du wie für ApplicationService auch 1-n NotificationService Einträge anlegen, von daher könntest Du es mal versuchen neben "ItemExternalActivatorService" einen zweiten Service zu definieren.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 28. Mai 2014 10:30
  • Hallo Olaf,

    hat nix gebracht. Ich habe auch mal die Reiehnfolge in der easervice.config vertauscht. Auch das ohne Erfolg.

    Volker


    Und Abends ein Glas Wein von AMAVINO

    Mittwoch, 28. Mai 2014 12:37
  • So, ich umgehe das jetzt auf Kosten von etwas Performance zunächst mal, damit es läuft.

    Ich habe eine neue Tabelle

    CREATE TABLE [dbo].[WorkServiceBroker](
    	[timestamp] [timestamp] NOT NULL,
    	[ID] [bigint] NOT NULL IDENTITY,
    	[CodeID] [int] NULL,
    	[Tablename] [varchar](50) NOT NULL
    )

    Diese Tabelle bekommt einen Insert-Trigger, der die Datensatz ID in die ItemTargetQueue schreibt. Über diese ID wird dann die eigentliche Tabelle und Datensatz ermittelt.

    Alle Tabellen, die eigentlich in eine separte Queue schreiben sollten, schreiben nun in diese neue Tabelle.

    Somit gibt es für den EAService nur eine Queue die er überwachen muss, den rest erledigt dann unser externes Programm.

    Dass ich somit eine zusätzliche Aktion eingefügt habe ist mir klar, aber es zählt erstmal nur eins: make it run.


    Und Abends ein Glas Wein von AMAVINO

    Mittwoch, 28. Mai 2014 19:23