none
Criando um service broker RRS feed

  • Pergunta

  •  Boa tarde a todos

      Eu estou tentando implementar um procedimento utilizando o Service Broker com os seguintes codigos:

     
    -----######### CRIANDO MENSAGEM ##########
    create message type msgrequisitarelatorio
    AUTHORIZATION DBO
       validation = empty
    
    create message type msgrespostarelatorio
    AUTHORIZATION DBO
       validation = empty
       
    ----##### CRIANDO CONTRATO #########
      CREATE CONTRACT REQREL
        AUTHORIZATION DBO(
                msgrequisitarelatorio
            SENT BY INITIATOR,        
                msgrespostarelatorio
            SENT BY TARGET      
                        )
     ---##### CRIANDO AS FILAS DO SERVICE BROKER #####
     
           CREATE QUEUE  DBO.CONTROLEPISCOFINS
       WITH 
       STATUS = ON,
       RETENTION = OFF 
       
       
          
           CREATE QUEUE  DBO.RESPONDEPISCOFINS
       WITH 
       STATUS = ON,
       RETENTION = OFF 
       
      ----####### CRIANDO O SERVICE BROKER QUE RECEBE E CONTROLA A TRIGGER#######
        CREATE SERVICE CONTROLEPISCOFINS
           ON QUEUE DBO.CONTROLEPISCOFINS  (REQREL)
      ----######   SERVIÇO QUE CONTROLA E EXECUTA A SPT PAR RELATÓRIO 
        CREATE SERVICE RESPONDEPISCOFINS
           ON   QUEUE DBO.RESPONDEPISCOFINS              

     E uma trigger inicia um dialogo:

     

                         BEGIN TRANSACTION;
                             DECLARE @InitDlgHandle UNIQUEIDENTIFIER,
                           @ReqRelat varchar(2),
                        @JOB INT, @DESCRICAO VARCHAR(20)
    
                          BEGIN DIALOG @InitDlgHandle
                            FROM SERVICE
                                 CONTROLEPISCOFINS
                            TO SERVICE
                                 N'RESPONDEPISCOFINS'
                            ON CONTRACT
                                 REQREL
                                  WITH
                                  ENCRYPTION = OFF;
    
                                   SELECT @ReqRelat = '<relatorio>Teste de fila</relatorio>' ;
    
                                 SEND ON CONVERSATION @InitDlgHandle
                                 MESSAGE TYPE 
                                 msgrequisitarelatorio
                               
                                   (@ReqRelat);
    
                                                       
                                COMMIT TRANSACTION; ROLLBACK

        Porem no final do dialogo a conver não segue para a proxima fila: e permanece o schema

       http://schemas.microsoft.com/SQL/ServiceBroker/Error quando eu consulto a fila initiator.

    Alguem pode me dar uma ajuda ai?

    Abraços

    • Movido Roberson Ferreira _ quinta-feira, 30 de agosto de 2012 21:24 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 30 de agosto de 2012 20:41

Todas as Respostas

  • Olá Saimon,

    Você esta declarando na trigger a variael @ReqRelat como varchar(2) e depois atribuindo uma string com mais que dois caracteres.

    tente  declarar @ReqRelat como XML que deve funcionar.


    [ ]´s,
    Lukas Baldan


    sexta-feira, 31 de agosto de 2012 11:24
  • Saimon,

    O Lukas deu uma sugestão interessante, ainda mais quanto trabalhar com Service Broker, Message, Queues, Dialog e Conversasion, o processo de troca de dados é feito em XML.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 31 de agosto de 2012 14:18
  • Boa Noite,

    Apenas uma complementação. Normalmente utiliza-se o Service Broker para trafegar mensagem no formato XML, mas é possível ainda trafegar mensagens sem conteúdo (apenas cabeçalho) ou ainda um conteúdo livre. O uso de mensagens com um corpo em BINARY e não em XML costuma ser a implementação mais performática possível, mas é claro que o uso do XML é muito mais fácil de montar além de economizar um esforço enorme na manutenção, pois, decompor mensagens em VARBINARY é muito trabalhoso (quase sempre a implementação em XML é mais interessante).

    Para mensagens curtas ou que por si só sinalizem um conteúdo, o uso de mensagens de corpo vazio é uma implementação mais interessante.

    No caso da dúvida, acredito que a observação do Lukas seja certeira. Sugiro pegar a mensagem de erro e converter o corpo para VARCHAR de forma a ver a mensagem exata de erro e a razão. Opcionalmente, você pode utilizar alguns eventos do Profiler relacionados ao Service Broker para capturar esse erro

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível



    quarta-feira, 5 de setembro de 2012 01:19
  • Blz Pessoal ja ajustei esse erro.

      Só pra finalizar:

       Blz galera ajudou muito ja resolvi essa parte agora to com outro problema:
    
     Automatizei a fila adcionando uma STP nela que é a seguinte:
    begin
    
    DECLARE @RecReqRel UNIQUEIDENTIFIER;
    DECLARE @RecReqMsg NVARCHAR(100);
    DECLARE @RecReqMsgName sysname;
    
    
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecReqRel = conversation_handle,
        @RecReqMsg = message_body,
        @RecReqMsgName = message_type_name
      FROM RESPONDEPISCOFINS
    ), TIMEOUT 1000;
    
    IF @RecReqMsgName =
       'msgrequisitarelatorio'
      
    BEGIN
       
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg = N'<ReplyMsg>RECEBIDO</ReplyMsg>';
     
         SEND ON CONVERSATION @RecReqRel
              MESSAGE TYPE 
              msgrespostarelatorio
              (@ReplyMsg);
              
               exec jinn.piscofins_rel.dbo.sp_relpiscofins 
    
         END CONVERSATION @RecReqRel;
    END
    
    
    
    end
    

      Reparem que tem uma "exec" metida ali no meio, porem ela não executa, pesquisei nos manuais mas nada diz que a fila automatizada não executa "exec's" internas.

      As conexões com o outro servidor/banco estão ok e a STP relacionada tbm ta ok.

    segunda-feira, 17 de setembro de 2012 19:09