Conversaciones de diálogo

Todos los mensajes enviados por Service Broker forman parte de una conversación. Un diálogo es una conversación entre dos servicios. Un diálogo es una secuencia bidireccional, persistente y confiable de mensajes entre dos servicios.

Los diálogos proporcionan entrega de mensajes EOIO (exactamente una vez por orden). Los diálogos utilizan el identificador de conversación y los números de secuencia incluidos en cada mensaje para identificar mensajes relacionados y entregar los mensajes en el orden correcto. Un diálogo es una secuencia persistente y confiable de mensajes entre dos servicios.

La conversación de diálogo está formada por dos participantes. El iniciador comienza la conversación. El destino acepta una conversación comenzada por el iniciador. Si un participante inicia la conversación, determina los mensajes que puede enviar, como se especifica en el contrato de la conversación. El siguiente diagrama muestra el flujo de mensajes de un diálogo.

Flujo de mensajes entre el iniciador y el destino

Las aplicaciones intercambian mensajes como parte del diálogo. Cuando SQL Server recibe un mensaje para un diálogo, SQL Server coloca el mensaje en la cola del diálogo. La aplicación recibe el mensaje desde la cola y lo procesa según sea necesario. Como parte del proceso, la aplicación puede enviar mensajes al otro participante del diálogo.

Entrega confiable

Los diálogos incorporan reconocimientos automáticos de recepción de mensajes para garantizar una entrega confiable. Service Broker guarda cada mensaje saliente en la cola de transmisión hasta que el servicio remoto reconoce el mensaje. Estos reconocimientos automáticos ahorran tiempo y recursos al eliminar la necesidad de que una aplicación reconozca explícitamente cada mensaje. Siempre que es posible, los mensajes de reconocimiento se incluyen como parte de los mensajes devueltos para el diálogo.

Nota

Service Broker controla los mensajes de reconocimiento internamente. Estos mensajes no aparecen en una cola y no se entregan a la aplicación.

Si no se puede obtener acceso a un servicio remoto, Service Broker no lo considera un error. Cuando no se puede obtener acceso a un servicio remoto, Service Broker retiene los mensajes para ese servicio hasta que se puede obtener acceso a él o hasta que el período de vigencia del diálogo expira.

Se pueden intercambiar mensajes entre las aplicaciones mientras no expira el período de vigencia del diálogo. El período de vigencia del diálogo se extiende desde el momento en que la instancia local de SQL Server crea el diálogo hasta que una aplicación lo finaliza explícitamente o recibe un mensaje de error relacionado con el diálogo. Cada participante es responsable de finalizar explícitamente la conversación cuando la aplicación recibe un mensaje que indica un error o el final de la conversación. En la mayoría de los servicios, un participante es responsable de indicar que la conversación ha finalizado y es correcta finalizando la conversación sin errores. El propósito de la conversación es el que decide si el responsable es el destino o el iniciador.

El Service Broker local de una aplicación iniciadora crea un extremo de conversación para el diálogo cuando la aplicación inicia el diálogo. El Service Broker local de una aplicación de destino crea un extremo de conversación para el diálogo cuando la instancia recibe el primer mensaje del diálogo.

Los diálogos también pueden garantizar que el período de vigencia de una conversación no supera un límite especificado. Opcionalmente, la aplicación iniciadora puede especificar un período de vigencia máximo para el diálogo. Tanto el Service Broker local como el Service Broker remoto realizan un seguimiento de este período de vigencia. Cuando un diálogo sigue activo durante el período de vigencia máximo, ambos extremos de la conversación sitúan un mensaje de error de tiempo de espera agotado en la cola del servicio y rechazan los nuevos mensajes para el diálogo. Las conversaciones nunca superan el período de vigencia máximo establecido cuando se inicia el diálogo. Tenga en cuenta que, si bien una aplicación puede seguir recibiendo mensajes para la conversación una vez que esta finaliza, no pueden llegar mensajes nuevos para esa conversación. La aplicación no puede enviar mensajes sobre la conversación.

Las aplicaciones son responsables de indicar cuándo terminan con un diálogo finalizando explícitamente el mismo. Service Broker nunca finaliza automáticamente un diálogo. El diálogo permanece en la base de datos hasta que una aplicación finaliza explícitamente la conversación. Por tanto, incluso cuando el diálogo agota el tiempo de espera o el broker informa sobre un error, cada participante de la conversación debe emitir la instrucción END CONVERSATION explícitamente.

Temporizador de conversación

El temporizador de conversación permite a una aplicación recibir un mensaje a una hora específica. Cuando expira el temporizador de conversación, SQL Server inserta un mensaje para la conversación en la cola de la conversación, en el extremo que inició el temporizador de conversación. Una aplicación puede utilizar un temporizador de conversación con cualquier fin. Un uso común del temporizador de conversación consiste en responder a los retrasos a las respuestas desde el servicio remoto. Otro uso común es crear un servicio que envíe mensajes al servicio remoto en intervalos establecidos. Por ejemplo, un servicio puede utilizar un temporizador de conversación para informar del estado actual de SQL Server cada pocos minutos. Las aplicaciones también pueden utilizar un temporizador de conversación para activar un procedimiento almacenado en un momento determinado. Esto permite que Service Broker admita actividades programadas.

Cada participante de una conversación puede establecer un temporizador de conversación por conversación. El temporizador de conversación no se comparte con el otro participante y no afecta al período de vigencia de la conversación. En su lugar, cuando el temporizador expira, el Service Broker local agrega un mensaje de tiempo de espera agotado a la cola del servicio local. Los mensajes de tiempo de espera agotado tienen el tipo https://schemas.Microsoft.com/SQL/ServiceBroker/DialogTimer