Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Managed Instance
Todas as mensagens enviadas pelo Service Broker fazem parte de uma conversa. Uma caixa de diálogo é uma conversa entre dois serviços. Uma caixa de diálogo é um fluxo bidirecional confiável e persistente de mensagens entre dois serviços.
As caixas de diálogo fornecem entrega de mensagens exatamente uma vez na ordem (EOIO). As caixas de diálogo usam o identificador de conversa e os números de sequência contidos em cada mensagem para identificar mensagens relacionadas e entregar mensagens na ordem correta. Uma caixa de diálogo é um fluxo confiável e persistente de mensagens entre dois serviços.
Uma conversa de diálogo tem dois participantes. O iniciador inicia a conversa. O alvo aceita uma conversa iniciada pelo iniciador. Se um participante inicia a conversa determina as mensagens que o participante pode enviar, conforme especificado no contrato para a conversa. O diagrama a seguir mostra o fluxo de mensagens de uma caixa de diálogo:
Os aplicativos trocam mensagens como parte da caixa de diálogo. Quando o SQL Server recebe uma mensagem para uma caixa de diálogo, o SQL Server coloca a mensagem na fila da caixa de diálogo. O aplicativo recebe a mensagem da fila e processa a mensagem conforme necessário. Como parte do processamento, o aplicativo pode enviar mensagens para o outro participante na caixa de diálogo.
Entrega fiável
As caixas de diálogo incorporam confirmações automáticas de recebimento de mensagens para garantir uma entrega confiável. O Service Broker salva cada mensagem de saída na fila de transmissão até que a mensagem seja confirmada pelo serviço remoto. Essas confirmações automáticas economizam tempo e recursos, tornando desnecessário que um aplicativo reconheça explicitamente cada mensagem. Sempre que possível, as mensagens de confirmação são incluídas como parte das mensagens de retorno para a caixa de diálogo.
Observação
O Service Broker lida com mensagens de confirmação internamente. Essas mensagens não aparecem em uma fila e não são entregues ao aplicativo. O Service Broker não considera um erro que um serviço remoto se torne inacessível. Quando um serviço remoto está inacessível, o Service Broker mantém mensagens para esse serviço até que o serviço se torne acessível ou o tempo de vida da caixa de diálogo expire.
Tempo de vida da caixa de diálogo
As mensagens podem ser trocadas entre aplicativos durante o tempo de vida da caixa de diálogo. O tempo de vida de uma caixa de diálogo dura desde o momento em que a instância local do SQL Server cria a caixa de diálogo até que um aplicativo termine explicitamente a caixa de diálogo ou receba uma mensagem de erro associada à caixa de diálogo. Cada participante é responsável por encerrar explicitamente a conversa quando o aplicativo recebe uma mensagem que indica um erro ou o fim da conversa. Na maioria dos serviços, um participante é responsável por indicar que a conversa está completa e bem-sucedida, terminando a conversa sem erro. Se isso é feito pelo alvo ou pelo iniciador depende do propósito da conversa.
O Service Broker local para um aplicativo inicial cria um ponto de extremidade de conversa para a caixa de diálogo quando o aplicativo inicia a caixa de diálogo. O Service Broker local para um aplicativo de destino cria um ponto de extremidade de conversa para a caixa de diálogo quando a instância recebe a primeira mensagem na caixa de diálogo.
As caixas de diálogo também podem garantir que o tempo de vida de uma conversa não exceda um limite especificado. O aplicativo inicial pode, opcionalmente, especificar um tempo de vida máximo para a caixa de diálogo. Tanto o Service Broker local quanto o Service Broker remoto acompanham esse tempo de vida. Quando uma caixa de diálogo permanece ativa no tempo de vida máximo, cada lado da conversa coloca uma mensagem de erro de tempo limite na fila de serviço e recusa novas mensagens para a caixa de diálogo. As conversas nunca vivem além do tempo de vida máximo estabelecido quando o diálogo é iniciado. Embora um aplicativo ainda possa receber mensagens para a conversa após o término da conversa, nenhuma nova mensagem pode chegar para essa conversa. O aplicativo não pode enviar mensagens sobre a conversa.
Os aplicativos são responsáveis por indicar quando terminaram uma caixa de diálogo, encerrando explicitamente a caixa de diálogo. O Service Broker nunca encerra uma caixa de diálogo automaticamente. A caixa de diálogo permanece no banco de dados até que um aplicativo termine explicitamente a conversa. Portanto, mesmo quando o diálogo expira ou o corretor relata um erro, cada participante da conversa deve emitir explicitamente a END CONVERSATION declaração.
Temporizador de conversação
Um temporizador de conversação permite que uma aplicação receba uma mensagem num momento específico. Quando o temporizador de conversação expira, o SQL Server insere uma mensagem para a conversação na fila da conversação no ponto de extremidade que iniciou o temporizador de conversação. Um aplicativo pode usar um temporizador de conversa para qualquer finalidade. Um uso comum para um temporizador de conversação é responder a atrasos nas respostas do serviço remoto. Outro uso comum é criar um serviço que envia mensagens para o serviço remoto em intervalos definidos. Por exemplo, um serviço pode usar um temporizador de conversa para relatar o estado atual do SQL Server a cada poucos minutos. Os aplicativos também podem usar um temporizador de conversa para ativar um procedimento armazenado em um determinado momento. Isso permite que o Service Broker ofereça suporte a atividades agendadas.
Cada participante de uma conversa pode definir um temporizador de conversação por conversa. O temporizador de conversação não é partilhado com o outro participante e o temporizador de conversação não afeta o tempo de vida da conversação. Em vez disso, quando o temporizador expira, o Service Broker local adiciona uma mensagem de tempo limite à fila do serviço local. Uma mensagem de tempo limite tem o nome do tipo https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer