Mostrando entradas con la etiqueta Service Broker. Mostrar todas las entradas
Mostrando entradas con la etiqueta Service Broker. Mostrar todas las entradas

viernes, 11 de diciembre de 2009

SQL SERVER Service Broker

El SQL Service Service Broker incluye la infraestructura necesaria para la programación asincrónica y se puede utilizar para la creación de aplicaciones distribuidas a través de múltiples bases de datos.

Ejemplo Basico de Service Broker

Crear Base de Datos y habilitar servicio

CREATE DATABASE ServiceBrokerTest
GO
USE ServiceBrokerTest
GO
-- Habilitar Service Broker
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER
GO


Son 4 Elementos Basicos

- Mensaje
- Contrato
- Cola
-Cola de Envio
-Cola de Recepcion
- Servicio
-Servicio de Envio
-Servicio de Recepcion


-- Crear Mensaje
CREATE MESSAGE TYPE SBMessage
VALIDATION = NONE
GO
-- Crear Contrato
CREATE CONTRACT SBContract
(SBMessage SENT BY INITIATOR)
GO
-- Crear Cola de Envio
CREATE QUEUE SBSendQueue
GO
-- Crear Cola de Recepcion
CREATE QUEUE SBReceiveQueue
GO

-- Crear Servicio de Envio para Cola de Envio
CREATE SERVICE SBSendService
ON QUEUE SBSendQueue (SBContract)
GO
-- Creando Servicio de Recepcion para Cola de Recepcion
CREATE SERVICE SBReceiveService
ON QUEUE SBReceiveQueue (SBContract)
GO

-- Iniciar Dialogo usando el servicio en el contrato
DECLARE @SBDialog uniqueidentifier
DECLARE @Message nvarchar(128)
BEGIN DIALOG CONVERSATION @SBDialog
FROM SERVICE SBSendService
TO SERVICE 'SBReceiveService'
ON CONTRACT SBContract
WITH ENCRYPTION = OFF
-- Enviando Mensajes al Dialogo
SET @Message = N'Primer Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N'Segundo Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N'Tercer Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
GO

-- Viendo Mensajes de la cola de Recepcion
SELECT CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

-- Recibiendo Mensajes de la Cola de Recepcion
RECEIVE TOP(1) CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

-- Recibiendo Mensajes de la Cola de Recepcion
RECEIVE CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

SQL Server Service Broker (SSSB)

El SQL Service Service Broker incluye la infraestructura necesaria para la programación asincrónica y se puede utilizar para la creación de aplicaciones distribuidas a través de múltiples bases de datos.

A continuacion se detalla la sintaxis basica para utilizar el SQL Server Service Broker.

1. Habilitar la base de datos
ALTER DATABASE Demo SET ENABLE_BROKER

2. Message Type
Define el nombre del mensaje y el tipo de informacion que el mensaje contiene. Estos mensajes deben ser creados en ambas partes de la conversacion

CREATE MESSAGE TYPE message_type_name
[AUTHORIZATION owner_name]
[VALIDATION =
{NONE EMPTY WELL_FORMED_XML
VALID_XML WITH SCHEMA COLLECTION schema_collection_name}]

Los posibles valores para VALIDATION son:
NONE: no se realiza ninguna validación
EMPTY: El cuerpo del mensaje debe tener valor NULO
WELL_FORMED_XML: Debe contener un XML bien formado
VALID_XML WITH SCHEMA COLLECTION: El contenido del XML debe cumplir con el XML SCHEMA señalado

Para modificarlo:
ALTER MESSAGE TYPE message_type_name
VALIDATION =
{NONE EMPTY WELL_FORMED_XML
VALID_XML WITH SCHEMA COLLECTION schema_collection_name}]

Y para eliminar:
DROP MESSAGE TYPE message_type_name

3. Contract
Define los tipos de mensajes que un servicio puede utilizar en una conversación y la dirección en que los mensajes pueden ser enviados

CREATE CONTRACT contract_name
[ AUTHORIZATION owner_name ]
( { message_type_name SENT BY { INITIATOR TARGET ANY }
[ DEFAULT ] } [ ,...n] )

Los posibles valores para SENT BY son:
INITIATOR: indica que solo el iniciador puede enviar dicho tipo de mensaje
TARGET: Indica que solo el destino puede enviar dicho tipo de mensaje
ANY: Indica que tanto el iniciador y el destino pueden enviar dicho tipo de mensaje

Para eliminar un contrato la sintaxis es la siguiente:

DROP CONTRACT contract_name

4. Queue
Define la ubicación donde se almacenaran los mensajes hasta que un servicio este disponible para atender los mensajes

CREATE QUEUE [database_name.[schema_name].schema_name.] queue_name
[ WITH
[ STATUS = { ON OFF } [ , ] ]
[ RETENTION = { ON OFF } [ , ] ]
[ ACTIVATION (
[ STATUS = { ON OFF } , ]
PROCEDURE_NAME = stored_procedure_name,
MAX_QUEUE_READERS = max_readers ,
EXECUTE AS { SELF 'user_name' OWNER }
) ]
]
[ ON { filegroup [ DEFAULT ] } ]

STATUS: Especifica si la cola esta habilitada. Cuando esta en OFF ningún servicio podría retirar mensajes de la cola.

RETENTION:Indica si la cola debe mantener todos los mensajes hasta que la conversación finalice

ACTIVATION STATUS: Indica si se debe activar el procedimiento almacenado cuando llegue un mensaje a la cola

MAX_QUEUE_READERS: Indica la cantidad máxima de servicio que correrán simultáneamente

EXECUTE AS: especifica la cuenta de usuario con que correrá el servicio

Para modificar esta es la sintaxis

ALTER QUEUE [database_name.[schema_name].schema_name.] queue_name
[ WITH
[ STATUS = { ON OFF } [ , ] ]
[ RETENTION = { ON OFF } [ , ] ]
[ ACTIVATION (
[ STATUS = { ON OFF } , ]
PROCEDURE_NAME = stored_procedure_name,
MAX_QUEUE_READERS = max_readers ,
EXECUTE AS { SELF 'user_name' OWNER }
] DROP })
]

Para eliminar una cola la sintaxis es:

DROP QUEUE [database_name.[schema_name].schema_name.] queue_name

5. SERVICE
Relaciona las colas con los contractos

CREATE SERVICE service_name
[ AUTHORIZATION owner_name ]
ON QUEUE [ schema_name. ]queue_name
[ ( contract_name [DEFAULT] [ ,...n ] ) ]

Para modificar el servicio utilice la siguiente sintaxis:

ALTER SERVICE service_name
[ON QUEUE [schema_name].queue_name]
[(ADD CONTRACT contract_nameDROP CONTRACT contract_name)]


ON QUEUE: Especifica la nueva cola para el servicio y mueve todos los mensajes de la cola vieja a la nueva

ADD CONTRACT: Añade un contrato a la colección de contratos asociados a este servicio

DROP CONTRACT: Especifica los contratos que se eliminaran del servicio. En caso de que alguno se este ejecutando mostrara un mensaje de error.

Para comenzar a usar los servicios se deben establecer una conversación. Estos son los pasos para establecer una conversación.

Crear la variable que identificara de manera única la conversación.

DECLARE @dialog_handle uniqueidentifier

Iniciar la conversación

BEGIN DIALOG [ CONVERSATION ] @dialog_handle
FROM SERVICE initiator_service_name
TO SERVICE 'target_service_name'
[ , { 'service_broker_guid' 'CURRENT DATABASE' } ]
[ ON CONTRACT contract_name ]
[ WITH
[ { RELATED_CONVERSATION = related_conversation_handle
RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]
[ [ , ] LIFETIME = dialog_lifetime ]
[ [ , ] ENCRYPTION = { ON OFF } ] ]

RELATED_CONVERSATION o RELATED_CONVERSATION_GROUP relaciona un nuevo dialogo con una conversacion existente

LIFETIME= tiempo en segundo en la que será valido el dialogo

Enviar mensaje

SEND
ON CONVERSATION conversation_handle
[ MESSAGE TYPE message_type_name ]
[ ( message_body_expression ) ]

El destino recibe el mensaje

[ WAITFOR ( ]
RECEIVE [ TOP ( n ) ]
[ ,...n ]
FROM
[ INTO table_variable ]
[ WHERE { conversation_handle = conversation_handle
conversation_group_id = conversation_group_id } ]
[ ) ] [ , TIMEOUT timeout ]

WAITFOR: especifica que la clausula RECEIVE espera un mensaje

RECEIVE: lee los mensajes de la cola y los elimina en caso de que la opción RETENTION de la cola este desactivada.

TOP: Indica cuantos mensajes se van a leer de la cola, sino se especifica se leerán todos los mensajes

INTO: Ingresa todos los mensajes en una tabla para ser tratados después

WHERE: especifica la conversación o grupo de conversaciones para los mensajes leídos

TIMEOUT: Especifica el tiempo en milisegundos en que la instrucción espera un mensaje.

Para terminar la conversación

END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
[ WITH CLEANUP ]