En el blog de formación hemos publicado la presentación (o estamos a punto de hacerlo) sin embargo el código lo voy a poner aquí :).

Los scripts tienen tres partes, en la primera configuramos toda la estructura, en la segunda enviamos un mensaje y en la tercera recibimos el mensaje y acabamos la conversación.

Espero que los que habéis visto la presentación la hayais disfrutado y que los que no la habéis visto os sirvan los scripts que hay a continuación.
Creando los esquemas

CREATE XML SCHEMA COLLECTION MiEsquemaEnvio AS

N‘<schema xmlns=”http://www.w3.org/2001/XMLSchema” >

        <element name=”Clientes”>

  <complexType>

   <sequence>

    <element name=”idCliente” type=”int” />

    <element name=”Nombre” type=”string”/>

   </sequence>

  </complexType>

 </element>

 </schema>

GO

CREATE XML SCHEMA COLLECTION MiEsquemaRecepcion AS

N‘<schema xmlns=”http://www.w3.org/2001/XMLSchema” >

          <element name=”Clientes”>

  <complexType>

   <sequence>

    <element name=”idCliente” type=”int” />

    <element name=”CreditoConcedido” type=”decimal”/>

   </sequence>

  </complexType>

 </element>

 </schema>

Creando Tipos de mensajes basados en esos esquemas

CREATE MESSAGE TYPE [Envio] VALIDATION= VALID_XML

             WITH SCHEMA COLLECTION MiEsquemaEnvio;

 

CREATE MESSAGE TYPE [Recepcion]

       VALIDATION=VALID_XML

             WITH SCHEMA COLLECTION MiEsquemaRecepcion;

GO

Creando contratos que permitan enviar y recibir mensajes de este tipo

CREATE CONTRACT [PeticionCredito]

       ([Envio] SENT BY  INITIATOR,[Recepcion] SENT BY TARGET)

Creando las colas para soportar estas cosas 

CREATE QUEUE Peticion  WITH STATUS=ON;

CREATE QUEUE Respuesta WITH STATUS=ON;

Creando servicios que usen estas colas

CREATE SERVICE SrvPeticion  ON

       QUEUE [Peticion]  ( PeticionCredito);

CREATE SERVICE SrvRespuesta ON

       QUEUE [Respuesta] ( PeticionCredito);

 

Enviando mensajes basados en esos servicios

DECLARE @Cliente xml(MiEsquemaEnvio)

 

DECLARE @message_type_name NVARCHAR(256)

 

DECLARE @conversationhandle UNIQUEIDENTIFIER

 

DECLARE @Conversacion TABLE(

     service_instance_id UNIQUEIDENTIFIER,

     handle UNIQUEIDENTIFIER,

     message_sequence_number BIGINT,

     service_name NVARCHAR(512),

     service_contract_name NVARCHAR(256),

     message_type_name NVARCHAR(256),

     validation NCHAR,

     message_body VARBINARY(MAX)) ;

 

Set @cliente=

CAST(N‘<Clientes>

        <idCliente>10</idCliente>

        <Nombre>Miguel Egea (Petición 1)</Nombre>

       </Clientes>’ as xml(MiEsquemaEnvio))

 

 

BEGIN TRANSACTION

       BEGIN DIALOG @conversationhandle

          FROM SERVICE SrvPeticion

          TO   SERVICE ‘SrvRespuesta’

          ON  CONTRACT PeticionCredito

        WITH ENCRYPTION=OFF;

 

        SEND ON CONVERSATION @conversationhandle

             MESSAGE TYPE Envio (@cliente)

COMMIT

 

Una vez que hemos enviado el mensaje, veamos como recibirlo en el destino.

DECLARE @Cliente xml(MiEsquemaEnvio)

Declare @conversationhandle uniqueidentifier

declare @saldoCliente as xml(MiEsquemaRecepcion)

Declare @id int

    DECLARE @Conversacion TABLE(

     service_instance_id UNIQUEIDENTIFIER,

     handle UNIQUEIDENTIFIER,

     message_sequence_number BIGINT,

     service_name NVARCHAR(512),

     service_contract_name NVARCHAR(256),

     message_type_name NVARCHAR(256),

     validation NCHAR,

     message_body VARBINARY(MAX)) ;

 

 

       BEGIN TRANSACTION

             WAITFOR

                    (

                    RECEIVE TOP (1)

                           conversation_group_id,

                           conversation_handle,

                           message_sequence_number,

                           service_name,

                           service_contract_name,

                           message_type_name,

                           validation,

                           message_body

                    FROM Respuesta

                    INTO @Conversacion

                    );

 

               SELECT @conversationhandle=handle,

                            @cliente=message_body

               FROM @Conversacion

 

Tenemos el mensaje, procesarlo ahora pertenece al proceso de negocio, vamos a usar el método value para leer el XML simplificando este proceso para centrarnos en el envio y tratamiento.

set @id=  @cliente.value(‘(/Clientes/idCliente)[1]’, ‘int’ )

SET @SaldoCliente=

CAST(N‘<Clientes>

       <idCliente>’ +  CAST(@id AS NVARCHAR(10))

     +‘</idCliente>

      <CreditoConcedido>1000.36</CreditoConcedido>

       </Clientes>’ as xml(MiEsquemaRecepcion));

            

   SEND ON CONVERSATION @conversationhandle

       MESSAGE TYPE Recepcion(@SaldoCliente)

 

 

       END CONVERSATION @conversationHandle;

 

 

 

       COMMIT

El que envió la petición ahora recibe la respuesta y la procesa como estime oportuno

WHILE (1=1)

 BEGIN

       BEGIN TRANSACTION

       WAITFOR

       (

        RECEIVE TOP(1)

                    conversation_group_id,

                    conversation_handle,

                    message_sequence_number,

                    service_name,

                    service_contract_name,

                    message_type_name,

                    validation,

                    message_body

      FROM Peticion

         INTO @Conversacion

         WHERE conversation_handle  = @ConversationHandle

      );

     

    SELECT CAST(Message_body as XML) FROM @CONVERSACION

       COMMIT

       SELECT @message_type_name=message_type_name

                    FROM @CONVERSACION

       IF @message_type_name =

             ‘http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog’

          OR @message_type_name =

              ‘http://schemas.microsoft.com/SQL/ServiceBroker/Error’

       BEGIN

        select  ‘acabo’

        END CONVERSATION @ConversationHandle ;

        BREAK;

       END

 

 END

Esto es un ejemplo de envio y recepción de mensajes mediante Service Broker, aunque hayamos puesto bucles infinitos y waitfors, no entendamos esto como una espera activa ni muchísimo menos, El tipo de aplicaciones que se desarrollen y su complejidad dependrá muchísimo de los requisitos de negocio, SB sin embargo es una plataforma robusta estable, escalable y muy fácilmente configurable que puede permitir hacer aplicaciones asíncronas fácilmente.

 

 

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You May Also Like

Sobre la nueva certificación MCDBA

Si has leido el mensaje Microsoft Certified Database Administrator for Yukon de Clemens Reijnen , ya sabres que Microsoft está cambiando esta certificación para hacerla m;as cercana a la realidad de las tareas que los administradores de bases de datos realizan cada día en su puesto de trabajo.
Active Directory Evolution RRSS
Leer más

Active Directory Evolution

¿Tú tampoco sabes lo que es Active Directory y cómo puede ayudar al desarrollo de tu entorno colaborativo? Nuestro compañero Miguel Salinas te explica lo que es Active Directory, cómo ha evolucionado a lo largo de los años y cómo sacarle partido a este servicio.