Conversações de diálogo

Todas as mensagens enviadas pelo Service Broker fazem parte de uma conversação. Um diálogo é uma conversação entre dois serviços. Um diálogo é um fluxo bidirecional confiável e persistente de mensagens entre dois serviços.

Os diálogos fornecem entrega de mensagens EOIO (exatamente-uma vez-na-ordem). Os diálogos usam o identificador de conversação e os números de seqüência contidos em cada mensagem para identificar as mensagens relacionadas e entregar mensagens na ordem correta. Um diálogo é um fluxo confiável e persistente de mensagens entre dois serviços.

Uma conversação de diálogo tem dois participantes. O iniciador inicia a conversação. O destino aceita uma conversação iniciada pelo iniciador. Se um participante inicia a conversa, isso determina as mensagens que ele pode enviar, conforme o especificado no contrato para a conversação. O seguinte diagrama mostra a o fluxo de mensagens de um diálogo:

Fluxo de mensagem entre iniciador e destino

Os aplicativos trocam mensagens como parte do diálogo. Quando o SQL Server recebe uma mensagem para um diálogo, o SQL Server coloca essa mensagem na fila para o diálogo. O aplicativo recebe a mensagem da fila e a processa conforme o necessário. Como parte do processamento, o aplicativo pode enviar mensagens ao outro participante do diálogo.

Entrega segura

Os diálogos incorporam confirmações automáticas de recebimento de mensagem para assegurar a entrega confiável. O Service Broker salva cada mensagem de saída na fila de transmissão até sua confirmação pelo serviço remoto. Essas confirmações automáticas economizam tempo e recursos tornando desnecessário para um aplicativo confirmar cada mensagem explicitamente. Quando possível, as mensagens de confirmação são incluídas como parte de mensagens de retorno para o diálogo.

ObservaçãoObservação

O Service Broker controla as 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 que seja um erro que um serviço remoto fique inalcançável. Quando um serviço remoto está inalcançável, o Service Broker armazena as mensagens desse serviço até que seja possível acessá-lo ou o tempo de vida do diálogo terminar.

Mensagens podem ser trocadas entre aplicativos durante o tempo de vida do diálogo. O tempo de vida de um diálogo vai da hora em que a instância local do SQL Server cria o diálogo até um aplicativo terminar explicitamente o diálogo ou receber uma mensagem de erro associada a esse diálogo. Cada participante é responsável por terminar explicitamente a conversação quando o aplicativo recebe uma mensagem que indica um erro ou o fim da conversação. Na maioria dos serviços, um participante é responsável por indicar que a conversação foi concluída e bem-sucedida terminando a conversação sem erros. Isso será feito pelo destino ou o iniciador, dependendo do propósito da conversação.

O Service Broker local para um aplicativo de início cria um ponto de extremidade de conversação para o diálogo quando o aplicativo inicia esse diálogo. O Service Broker local de um aplicativo de destino criar um ponto de extremidade de conversação para o diálogo quando a instância recebe a primeira mensagem no diálogo.

Os diálogos também podem garantir que o tempo de vida de uma conversação não exceda um limite especificado. O aplicativo de início pode especificar um tempo de vida máximo para o diálogo. O Service Broker local e o Service Broker remoto controlam esse tempo de vida. Quando um diálogo permanece ativo pelo tempo de vida máximo, cada lado da conversação coloca uma mensagem de erro de tempo limite na fila do serviço e recusa novas mensagens para o diálogo. As conversações nunca ultrapassam o tempo de vida máximo estabelecido quando o diálogo é iniciado. Observe que, embora um aplicativo ainda possa receber mensagens para a conversação após o término dela, nenhuma mensagem nova poderá chegar para essa conversação. O aplicativo não pode enviar mensagens sobre a conversação.

Os aplicativos são responsáveis por indicar quando terminam com um diálogo terminando explicitamente esse diálogo. O Service Broker nunca termina um diálogo automaticamente. O diálogo permanece no banco de dados até um aplicativo terminar a conversação de modo explícito. Assim, mesmo que o tempo limite do diálogo seja alcançado ou o agente reporte um erro, cada participante na conversação deve emitir explicitamente a instrução END CONVERSATION.

Timer de conversação

Um timer de conversação permite a um aplicativo receber uma mensagem em uma determinada hora. Quando o timer da conversação expira, o SQL Server insere uma mensagem para a conversação na fila dela, no ponto de extremidade que iniciou o timer de conversação. Um aplicativo pode usar um timer de conversação para qualquer finalidade. Um uso comum para um timer de conversação é responder a atrasos em respostas do serviço remoto. Outro uso comum é criar um serviço que envia mensagens ao serviço remoto a intervalos definidos. Por exemplo, um serviço pode usar um timer de conversação para reportar o estado atual do SQL Server em prazos estabelecidos de minutos. Os aplicativos também podem usar um timer de conversação para ativar um procedimento armazenado em um certo momento. Isso permite que o Service Broker ofereça suporte a atividades agendadas.

Cada participante em uma conversação pode definir um timer por conversação. O timer de conversação não é compartilhado com o outro participante e não afeta o tempo de vida da conversação. Em vez disso, quando o timer expira, o Service Broker local adiciona uma mensagem de tempo limite para a fila do serviço local. Uma mensagem de tempo limite tem o nome de tipo https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer