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 ]