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

Forzar affinidad NUMA para SSIS

Hace algún tiempo escribí sobre paralelismo en SQL Server y debatimos entre algunas cosas sobre la importancia del afinamiento de CPU a la hora de obtener el máximo rendimiento de tu Hardware (puedes leer aqui: Paralelismo en SQL Server (I) )

Power BI Dataflows: Machine Learning en dos clicks!

En esta entrada continuaremos con la saga "en dos clicks", en la entrada anterior explicamos como hacer análisis de sentimiento en dos clicks con Power BI dataflows y ahora es el turno de mostrar cómo crear modelos de machine learning de forma automática utilizando la nueva funcionalidad abierta a través de los Power BI Dataflows.