Inquiridor
Criando um service broker

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)
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- Editado Lukas de Castro Ruocco Baldan sexta-feira, 31 de agosto de 2012 12:20
-
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]
-
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
- Editado Gustavo Maia Aguiar quarta-feira, 5 de setembro de 2012 01:21
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 12 de setembro de 2012 18:23
-
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.