Este tema proporciona información específica para tratar los mensajes que pertenecen al dominio BLOB y que se analizan mediante el analizador BLOB.
El contenido de un mensaje BLOB no puede manipularse porque no tiene ninguna estructura predefinida. No obstante, puede hacer referencia a su contenido utilizando su posición conocida dentro de la corriente de bits y procesar el mensaje con un conocimiento mínimo de su contenido.
El analizador de cuerpos de mensajes BLOB no crea una estructura de árbol de la misma forma que otros analizadores del cuerpo de mensaje. No tiene un BLOB de elemento raíz que es un elemento dependiente, llamado también BLOB, que contiene datos.
Puede hacer referencia al contenido del mensaje utilizando subseries si se sabe la ubicación de un trozo de información concreto dentro de los datos BLOB. Por ejemplo, la siguiente expresión identifica el décimo byte del cuerpo del mensaje:
InputBody.BLOB.BLOB[10]
La siguiente expresión hace referencia a 10 bytes de los datos del mensaje empezando en el desplazamiento 10:
SUBSTRING(InputBody.BLOB.BLOB from 10 for 10)
En este ejemplo se muestra cómo manipular un mensaje BLOB de longitud variable. En el ejemplo se da por supuesto que se ha configurado un flujo de mensajes que recibe un mensaje BLOB de longitud variable, analiza algunos de los campos invocando el analizador MRM y direcciona el mensaje de salida a la cola de salida correcta en función de la información analizada.
El mensaje de entrada está en formato BLOB y se supone que contiene nulos incorporados ('x00'), por lo que no se puede definir como terminado por nulo.
En este ejemplo se muestra el ESQL necesario para:
Al hacerlo puede definir el modelo de mensaje con un campo de longitud de entero seguido del mensaje BLOB.
Este mensaje también muestra cómo convertir el mensaje BLOB a CWF, procesarlo y eliminar el campo de longitud añadido.
En este ejemplo, el registro de entrada tiene el formato siguiente:
Este campo se utiliza un entero para direccionar el mensaje a colas distintas en función de los criterios definidos por el cliente.
Defina un nuevo mensaje BLOB_Example que incluya los siguientes elementos y tipos:
En esta sección se describen las características del flujo de mensajes. Si desea implementar este flujo de mensajes, debe completar la definición de flujo de mensajes (por ejemplo, creando los tres subflujos de modo que sustituyan los nodos de salida utilizados aquí para manejar casos falsos, desconocidos o anómalos) y proporcionar todo el soporte necesario para su difusión y ejecución (por ejemplo, crear las colas de entrada y las colas de salida del gestor de colas para el intermediario al que se difunde el flujo).
-- Declare local variables DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); DECLARE MSGLEN CHARACTER; DECLARE NUMBER INTEGER; DECLARE RESULT INTEGER; DECLARE REM INTEGER; -- Copy message headers WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; -- -- Set MSGLEN to non NULL to avoid errors when concatenating the first time -- SET MSGLEN = 'X'; -- -- Get the length of the BLOB and substract the length of VERSION_NUM and STORE_NUM (11+10) SET NUMBER = LENGTH("InputRoot"."BLOB"."BLOB")-21; -- -- Convert NUMBER to hexadecimal. The remainder of dividing by 16 is calculated recursively. -- WHILE NUMBER > 15 DO SET RESULT = NUMBER/16; SET REM = NUMBER - RESULT*16; SET MSGLEN = CASE WHEN REM < 10 THEN CAST(REM AS CHARACTER) || MSGLEN WHEN REM = 10 THEN 'A' || MSGLEN WHEN REM = 11 THEN 'B' || MSGLEN WHEN REM = 12 THEN 'C' || MSGLEN WHEN REM = 13 THEN 'D' || MSGLEN WHEN REM = 14 THEN 'E' || MSGLEN ELSE 'F' || MSGLEN END; SET NUMBER = RESULT; END WHILE; SET REM = NUMBER; SET MSGLEN = CASE WHEN REM < 10 THEN CAST(REM AS CHARACTER) || MSGLEN WHEN REM = 10 THEN 'A' || MSGLEN WHEN REM = 11 THEN 'B' || MSGLEN WHEN REM = 12 THEN 'C' || MSGLEN WHEN REM = 13 THEN 'D' || MSGLEN WHEN REM = 14 THEN 'E' || MSGLEN ELSE 'F' || MSGLEN END; -- -- Add leading '0's up to a length of 9 to be able to cast as BLOB. -- Remember it started with MSGLEN set to X (length 1) WHILE LENGTH(MSGLEN) < 9 DO SET MSGLEN = '0' || MSGLEN; END WHILE; -- -- Change to appropriate endian (PLATFORM DEPENDENT) -- If no endian swapping needed then remember to get rid of the last character as below -- SET MSGLEN = SUBSTRING(MSGLEN FROM 1 FOR 8); -- SET MSGLEN = SUBSTRING(MSGLEN FROM 7 FOR 2) || SUBSTRING(MSGLEN FROM 5 FOR 2) || SUBSTRING(MSGLEN FROM 3 FOR 2) || SUBSTRING(MSGLEN FROM 1 FOR 2); SET "OutputRoot"."BLOB"."BLOB" = CAST(MSGLEN AS BLOB) || "InputRoot"."BLOB"."BLOB";
CAST("Body"."e_STORE_NUM" AS INTEGER) < 151
Esta sentencia se basa en la suposición arbitraria de que un mensaje de entrada de un número de tienda es inferior a 151 y que se direcciona a una cola específica. Puede escribir otro código para la prueba, si lo desea.
Este subflujo maneja un error que tiene un formato esperado (la prueba realizada en el nodo Filter ha devuelto true). El mensaje satisfactorio se escribe en la cola de salida en su formato original; el mensaje se vuelve a convertir de MRM a BLOB y se eliminan los cuatro bytes que se han añadido (campo B_LEN).
Para este subflujo:
-- Copy message headers DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; -- -- Remove the 4 bytes length field added previously -- SET "OutputRoot"."BLOB"."BLOB" = SUBSTRING("InputRoot"."BLOB"."BLOB" FROM 5);
Este nodo Compute elimina los cuatro bytes que se añadieron al principio del mensaje BLOB para dar soporte a esta manipulación.
Observe la utilización de la variable, J, que se ha inicializado con el valor de cardinalidad de las cabeceras existentes en el mensaje. Es más eficaz que calcular la cardinalidad de cada iteración del bucle, que sucede si codifica la siguiente sentencia WHILE:
WHILE I < CARDINALITY(InputRoot.*[]) DO
Conceptos relacionados
Flujos de mensajes
Dominio y analizador BLOB
Propiedades promocionadas
ESQL
Diseño de mensajes
Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Configuración de un nodo
Gestión de archivos ESQL
Definición de propiedades promocionadas
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Nodo MQInput
Nodo MQOutput
Nodo ResetContentDescriptor
ESQL
Función CARDINALITY
Función CASE
Función CAST
Sentencia DECLARE
Sentencia SET
Función SUBSTRING
Sentencia WHILE
Avisos |
Marcas registradas |
Descargas |
Biblioteca |
Soporte |
Información de retorno (feedback)
![]() ![]() |
ac11640_ |