2011-11-23 4 views
1

Dans mon application, j'ai besoin d'appeler un processus stocké de manière asynchrone. Pour cela, j'utilise Sql Service Broker. Voici les étapes impliquées dans la création de l'appel asynchrone.Appel asynchrone d'un processus stocké utilisant le service Broker

1) J'ai créé Message, Contrat, File d'attente, Service. Et l'envoi de messages. Je peux voir mes messages dans 'ReceiveQueue1'.

2) J'ai créé un processus enregistré et une file d'attente Lorsque j'exécute le processus stocké (proc_AddRecord), il ne s'exécute qu'une seule fois. Sa lecture tous les enregistrements dans les files d'attente et l'ajout de ces enregistrements à la table. Jusqu'à ce point, il fonctionne très bien. Mais lorsque j'ajoute de nouveaux messages à 'ReceiveQueue1', ma proc mémorisée n'ajoute pas automatiquement ces enregistrements à la table. Je dois ré exécuter le processus stocké (proc_AddRecord) en ordre pour ajouter les nouveaux messages. Pourquoi le processus stocké n'est pas exécuté. Ce que je suis supposé faire pour appeler le processus stocké de manière asynchrone. Le but de l'utilisation de Service Broker est d'appeler de manière asynchrone les procs stockés. Je suis totalement nouveau à SQL Server Service Broker. Appréciez toute aide. Voici mon code pour le proc stocké

#
--exec proc_AddRecord 

ALTER PROCEDURE proc_AddRecord 
AS 

Declare 
    @Conversation UniqueIdentifier, 
    @msgTypeName nvarchar(200), 
    @msg varbinary(max) 

While (1=1) 
Begin 
    Begin Transaction; 

    WAITFOR 
    (
     Receive Top (1) 
      @Conversation = conversation_handle, 
      @msgTypeName = message_type_name, 
      @msg = message_body 
     from dbo.ReceiveQueue1 
    ), TIMEOUT 5000 


    IF @@Rowcount = 0 
     Begin 
      Rollback Transaction 
      Break 
     End 
    PRINT @msg 
    If @msg = 'Sales' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(101,'Reeves',51, 29) 
      COMMIT Transaction 
      Continue 
     End 
    If @msg = 'HR' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(102,'Cussac',55, 14) 
      COMMIT Transaction 
      Continue 
     End 

    Begin 
     Print 'Process end of dialog messages here.' 
     End Conversation @Conversation 
     Commit Transaction 
     Continue 
    End 
    Rollback Transaction 
END 

ALTER QUEUE AddRecorQueue 
WITH ACTIVATION (
       PROCEDURE_NAME=proc_AddRecord, 
       MAX_QUEUE_READERS = 1, 
       STATUS = ON, 
       EXECUTE AS 'dbo'); 

Répondre

2

Vous dites que vous exécutez la procédure stockée, vous ne devriez pas besoin de le faire, même pas une fois, il devrait toujours être fait avec l'activation. Si votre activation se fait sur votre 'ReceiveQueue1' au lieu de votre 'AddRecorQueue' je ne peux pas voir le reste de votre code, mais les noms le suggèrent.

Où commence et se termine votre procédure stockée? Généralement je mettrais BEGIN juste après l'instruction AS et END où la procédure stockée devrait se terminer, Si vous n'avez pas ces derniers alors vous auriez besoin d'une instruction GO pour le séparer. Sinon, votre instruction ALTER QUEUE ferait partie de la procédure stockée

Vous avez également "Rollback Transaction", donc même si l'activation fonctionnait, tout serait annulé, ou générer une erreur disant qu'il n'y avait aucune transaction. Les instructions IF ont été déclenchées. Je suggère que vous suiviez this tutorial for service broker en général et this one about internal activation. Ils devraient vous aider à démarrer.

+0

Excellent, j'ai ajouté l'activation à '' ReceiveQueue1 '' et cela a fonctionné parfaitement. J'ai supprimé la restauration à la fin. Merci de votre aide. – Henry

Questions connexes