№14. Маршрутизация сообщений

Тема: Маршрутизация сообщений

Время на выполнение: 60 минут

Задание

В приложение из лабораторной работы №13 добавить следующие проверки:

  1. В таблице сделок проверить есть ли сделка с номером входящей анкеты, если есть, то отклонить заявку
  2. проверку на существование клиента в таблице клиентов. В зависимости от результата добавить нового клиента или обновить данные старого клиента.
  3. В результате работы процесса возвращать в ответную очередь сообщение о статусе обработки:

 

<Result id=””>
      <Status></Status>
<Description></Description>
</Result>

 

Примеры:

<Result id=”1”>
      <Status>OK</Status>
<Description></Description>
</Result>

 

<Result id=”1”>
      <Status>ERROR</Status>
<Description>Сделка существует</Description>
</Result>

 

<Result id=”1”>
      <Status>ERROR</Status>
<Description>Ошибка при обработке</Description>
</Result>

Выполнение

Откройте приложение LAB.13

Импортируйте схему сообщения из каталога LAB на рабочем столе.
image002

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://sharavara.com" xmlns:Q1="http://sharavara.com">   <xsd:el
ement name="Result" type="Q1:ResultType"></xsd:element>

   <xsd:complexType name="ResultType">
               <xsd:sequence>
                              <xsd:element name="Status" type="xsd:string"></xsd:element>
                              <xsd:element name="Description" type="xsd:string"></xsd:element>
               </xsd:sequence>
               <xsd:attribute name="id" type="xsd:string"></xsd:attribute>
   </xsd:complexType>
</xsd:schema>

Откройте поток Database и добавьте в рабочую область ноду Filter
image003

Переименуйте ноду в DealCheck и поместите ее между нодами LAB.13.IN и GetProd
image004

Добавьте в рабочую область еще 2 ноды:
image005

Свойства нод:

DealCheck
image006
Unknown
image007

Откройте модуль Database_DealCheck.esql
image008

Напишите следующий код:

DECLARE id CHARACTER;
SET id = Body.ns:Application.id;
DECLARE Deal ROW;
SET Deal = THE(SELECT D.ID FROM Database.LAB_DEALS AS D WHERE D.ID = id);

IF EXISTS(Deal.ID[]) THEN
     RETURN FALSE;
ELSE
     RETURN TRUE;
END IF;

RETURN UNKNOWN;

image009

Для модуля Database_Exist пропишите следующий код:

CALL CopyMessageHeaders();
SET OutputRoot.XMLNSC.ns:Result.id = InputRoot.XMLNSC.ns:Application.id;
SET OutputRoot.XMLNSC.ns:Result.Status = 'ERROR';
SET OutputRoot.XMLNSC.ns:Result.Description = 'The deal is already exist';

image010

Измените свойство ноды LAB.13.OUT
image011

Добавьте в рабочую область 2 ноды:

    • Flow Order
      image012
    • Compute
      image013

Соедините их как показано на рисунке
image014
Для модуля ноды CommonError пропишите следующий код:

CALL CopyMessageHeaders();
SET OutputRoot.XMLNSC.ns:Result.id = InputRoot.XMLNSC.ns:Application.id;
SET OutputRoot.XMLNSC.ns:Result.Status = 'ERROR';
SET OutputRoot.XMLNSC.ns:Result.Description = 'Common error. Check log.';

image015

Добавьте в рабочую область 2 ноды:

  • Route — Route
  • Compute – ProdNotFound

Соедините их как показано на рисунке
image016

Для ESQL модуля ProdNotFound пропишите нижеследующий код:

CALL CopyMessageHeaders();
SET OutputRoot.XMLNSC.ns:Result.id = InputRoot.XMLNSC.ns:Application.id;
SET OutputRoot.XMLNSC.ns:Result.Status = 'ERROR';
SET OutputRoot.XMLNSC.ns:Result.Description = 'Product not found';
RETURN TRUE;

image017

Свойства узла Route:

Нажмите Add
image018

Нажмите «Edit…»
image019

Введите XPath Expression:
image020

count($Environment/Variables/Prod/*)>0

image021

Укажите Distribution mode: First
image022

 

Откройте на редактирование файл Database_SaveData.esql.

Полностью замените код на указанный ниже:

 

BROKER SCHEMA com.sharavara

CREATE COMPUTE MODULE Database_SaveData
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyMessageHeaders();
--CALL CopyEntireMessage();
DECLARE ref REFERENCE TO InputRoot.XMLNSC.ns:Application;
--Save Client
DECLARE ClientID ROW;
SET ClientID = THE(
                   SELECT X.ID
                   FROM Database.LAB_CLIENT AS X
                   WHERE X.ID = ref.Client.id
                   );
    IF EXISTS(ClientID.ID[]) THEN
         CALL UpdateClient(ref);
    ELSE
        CALL InsertClient(ref);
    END IF;

    DECLARE dbPhones ROW;
    SET dbPhones.Phone[] = SELECT ITEM Z.PTYPE FROM Database.LAB_CLIENT_PHONES AS Z WHERE Z.CLIENTID =
 ref.Client.id;
--Save Phones
DECLARE ph REFERENCE TO ref.Client.Phones;
MOVE ph FIRSTCHILD;
WHILE LASTMOVE(ph) DO
     IF EXISTS(SELECT F.* FROM dbPhones.Phone[] AS F where F = ph.type) THEN
             CALL UpdatePhone(ref.Client.id, ph);
     ELSE
             CALL InsertPhone(ref.Client.id, ph);
     END IF;
     MOVE ph NEXTSIBLING;
END WHILE;

--Save Dial
INSERT INTO Database.LAB_DEALS (
                               ID,
                               CLIENTID,
                               PRODID,
                               TERM,
                               RATE,
                               AMOUNT,
                               BEGINDATE,
                               ENDDATE )
VALUES (
                               ref.id,
                               ref.Client.id,
                               Environment.Variables.Prod.ID,
                               Environment.Variables.Prod.Tariff.PERIOD,
                               Environment.Variables.Prod.Tariff.RATE,
                               ref.Sum,
                               CURRENT_DATE,
                               CURRENT_DATE + CAST(ref.Period AS INTERVAL MONTH)
);
--OK Message
SET OutputRoot.XMLNSC.ns:Result.id = InputRoot.XMLNSC.ns:Application.id
SET OutputRoot.XMLNSC.ns:Result.Status = 'OK';
SET OutputRoot.XMLNSC.ns:Result.Description = '';

RETURN TRUE;
END;

CREATE PROCEDURE CopyMessageHeaders() BEGIN
DECLARE I INTEGER 1;
DECLARE J INTEGER;
SET J = CARDINALITY(InputRoot.*[]);
WHILE I < J DO
   SET OutputRoot.*[I] = InputRoot.*[I];
   SET I = I + 1;
END WHILE;
END;

CREATE PROCEDURE CopyEntireMessage() BEGIN
SET OutputRoot = InputRoot;
END;

--Insert client
CREATE PROCEDURE InsertClient(IN ref REFERENCE)
BEGIN
INSERT INTO Database.LAB_CLIENT (
                               ID,
                               LASTNAME,
                               FIRSTNAME,
                               DOB,
                               PNUM,
                               PDATE
                               )
VALUES (
                               ref.Client.id,
                               ref.Client.LastName,
                               ref.Client.FirstName,
                               ref.Client.DOB,
                               ref.Client.Passport.Number,
                               ref.Client.Passport.Date
);
END;

--Update Client
CREATE PROCEDURE UpdateClient (IN ref REFERENCE )
BEGIN
UPDATE Database.LAB_CLIENT AS L
       SET LASTNAME = ref.Client.LastName,
       FIRSTNAME = ref.Client.FirstName,
       DOB = ref.Client.DOB,
       PNUM = ref.Client.Passport.Number,
       PDATE = ref.Client.Passport.Date
WHERE L.ID = ref.Client.id;
END;

--Insert phone
CREATE PROCEDURE InsertPhone (IN id CHARACTER, IN ph REFERENCE )
BEGIN
INSERT INTO Database.LAB_CLIENT_PHONES (
                               CLIENTID,
                               PTYPE,
                               PHONE )
VALUES (
                               id,
                               ph.type,
                               ph
);
END;

--Update phone
CREATE PROCEDURE UpdatePhone (IN id CHARACTER, IN ph REFERENCE )
BEGIN
UPDATE Database.LAB_CLIENT_PHONES AS L
      SET PHONE = ph
WHERE L.CLIENTID = id AND L.PTYPE = ph.type;
END;

END MODULE;

image023
image024

image025

image026

Протестируйте приложение при помощи тестового клиента.