Exit MQSeries de "Logging" de Mensajes

Utilitarios artesanales que desarrollamos para nosotros y deseamos compartir (en C o C++)
Responder
Avatar de Usuario
LuisFer
Colaborador Senior
Colaborador Senior
Mensajes: 384
Registrado: 27 May 2006, 16:06
País: España
Ciudad: Madrid
Ocupación: Otra

Exit MQSeries de "Logging" de Mensajes

Mensaje por LuisFer » 17 Nov 2007, 08:03

Código: Seleccionar todo

/*********************************************************************/
/*                                                                   */
/* Software:     MSGMONZ - Exit de mensajes  MQSeries                */
/*               (c) Copyright Nacho/LuisFer                         */
/*                                                                   */
/* Estado:       Version 5 Release 3 Modificacion 1                  */
/* Modificado:   Julio 2006                                          */
/*                                                                   */
/* Autor:        Nacho/LuisFer                                       */
/*                                                                   */
/*                                                                   */
/* Descripcion:  Realiza un duplicado de cada Mensaje que pasa a tra-*/
/*               vés de un canal MQ y lo coloca en la cola definida  */
/*               en la MSGDATA. Su intención es poder realizar audi- */
/*               torias de los mensajes que llegan/viajan a traves de*/
/*               un canal MQ                                         */
/*                                                                   */
/* Modificado:   17 de Noviembre de 2007                             */
/*                                                                   */
/* Autor:        Nacho/LuisFer                                       */
/*                                                                   */
/* Descripcion:  Publicar como código abierto para Dinoland.com.ar   */
/*                                                                   */
/* Aviso: Este fuente se distribuye "como es" es decir sin ningun    */
/*        tipo de garantía ni soporte por su uso.                    */
/*        Por favor, si Vd encuentra este software util una donacion */
/*        al sitio que lo publica y/o a una ONG (legal) será de agra-*/
/*        decer                                                      */
/* Referencias: Basado en la idea de un SP de IBM (MSGMON) de graba- */
/*              cion de mensajes, con la diferencia de que la escri- */
/*              tura del Mensaje en lugar de realizarse sobre fichero*/
/*              se realiza a una cola, con lo cual se gana en rendi- */
/*              miento. El desarrollo del código es completamente    */
/*              diferente                                            */
/* Los autores disponen de un Monitor auditor (no de código abierto  */
/* Este fuente esta preparado para funcionar exclusivamente bajo z/OS*/
/* pero con ligeras modificaciones se puede portar a otros SSOOs     */
/* Actualmente está probado con garantias en z/OS,Tandem,SunOS,Linux */
/* El consumo de recursos es practicamente despreciable y no impacta */
/* en tiempos de respuesta                                           */
/* Para el caso del Z es necesario añadir a la STC MQCHIN la siguien-*/
/* te DD                                                             */
/* SYSPRINT DD SYSOUT=*                                              */
/* Activación:                                                       */
/* Es necesario realizar un ALTER al canal de la siguiente manera:   */
/* ALT CHL(Nombre_Canal) CHLTYPE(Tipo_Canal) MSGMEXIT('MSGMONZ') +   */
/* MSGDATA('Nombre_QMgr,Nombre_Cola_Destino,')                       */
/* La MSGDATA debe acabar en "," para determinar el fin del parámetro*/
/* No debe exceder de 32 caracteres (incluidas las comas) esto es asi*/
/* por definicion en el MQSeries.                                    */
/* El nombre de la Cola de Destino no puede exceder de 24 caracteres */
/*                                                                   */
/* Ejemplo de JCL de Compilación:(añadir los "slash" del JCL)        */
/*--------------------------------------------------------------------
Jobname JOB  (xx,xx,xx),'  '                      
*------------------------------------------------------------------*** 
*-  PROCEDIMIENTO DE COMPILACION C                               --*** 
*-  CAMBIAR L POR LA VERSION DE MQSERIES ACTUAL ###              --*** 
*-  REVISAR LKED.SYSIN                                           --*** 
*------------------------------------------------------------------*** 
CMQOMP PROC NOMBRE=,O1=*,O2=*,L=###                                  
*-------------------------------------------------------------------  
*--------------------------------------------------------------        
*  COMPILE STEP:                                                      
*-------------------------------------------------------------------  
COMP EXEC PGM=CCNDRVR,                                                
 PARM='/LSE(''MQhlq.&L..SCSQC370''),XREF,                            * 
             OPTFILE(DD:OPTFIJO)'                                      
*-------------------------------------------------------------------  
STEPLIB  DD DSN=CBC.SCCNCMP,DISP=SHR                                  
SYSIN    DD DSN=libreria.fuentes(&NOMBRE),DISP=SHR                  
SYSLIN   DD  DSNAME=&&LOADSET,                                        
             DISP=(MOD,PASS),SPACE=(TRK,(3,3)),                        
             DCB=(RECFM=FB,LRECL=80,BLKSIZE=3200)                      
SYSPRINT DD SYSOUT=&O1,OUTLIM=1000000                                  
OPTFIJO  DD * 
 SE('CEE.SCEEH.+','CBC.SCLBH.+')    
 SO                                  
 LIST                                
 OFFSET                              
 MAR(1,72)                          
 SEQ(73,80)                                        
SYSOUT   DD SYSOUT=&O1,OUTLIM=1000000                                  
SYSCPRT  DD SYSOUT=&O1,OUTLIM=1000000                                  
SYSABEND DD SYSOUT=&O2,OUTLIM=1000000                                  
SYSUDUMP DD SYSOUT=&O2,OUTLIM=1000000                                  
*-------------------------------------------------------------------  
*  BIND STEP:                                                          
*-------------------------------------------------------------------  
LKED   EXEC PGM=IEWL,                                                  
 COND=((8,LT,COMP)),      
 PARM='AMODE=31,MAP,RENT,DYNAM=DLL,CASE=MIXED,COMPAT=CURR'      
SYSLIB   DD DSN=CEE.SCEESPC,DISP=SHR (DELANTE DE SCEELKED)      
         DD DSN=CEE.SCEERUN,DISP=SHR                            
         DD DSN=CEE.SCEECPP,DISP=SHR                            
         DD DSN=CEE.SCEELKEX,DISP=SHR                          
         DD DSN=CEE.SCEELKED,DISP=SHR                          
         DD DSN=MQhlq.&L..SCSQLOAD,DISP=SHR                    
         DD DSN=MQhlq.&L..SCSQAUTH,DISP=SHR                    
         DD DSN=MQhlq.CARGABLE,DISP=SHR                  
         DD DSN=SYS1.CSSLIB,DISP=SHR                            
SYSLIN   DD DSNAME=&&LOADSET,DISP=(OLD,PASS)                    
         DD DDNAME=SYSIN                                        
SYSLMOD  DD DSN=CARGABLE(&NOMBRE),DISP=SHR          
SYSDEFSD DD DUMMY                                              
SYSPRINT DD SYSOUT=&O1,OUTLIM=1000000                          
SYSIN    DD DUMMY                                              
*-------------------------------------------------------------- 
 PEND                                                          
P1 EXEC CMQOMP,NOMBRE=MSGMONZ                                  
LKED.SYSIN DD *                                                
 INCLUDE SYSLIB(CSQXSTUB)                                                
 ENTRY MSGMONZ                                                          
 NAME  MSGMONZ(R)                                                        
***---------------------------------------------------------------*** 
-------------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* Pseudocodigo                                                    */
/* En inicio (MQXR_INIT) lectura de MSGDATA                        */
/*            Obtencion de QMgrName y Nombre de Cola de Destino    */
/*            Conexion al QMgr y Apertura de Cola si es posible    */
/*            Definir opciones API MQ                              */
/* En Ejecucion (MQXR_MSG) Escritura de Mensaje si se obtuvo hConn */
/*              hOBJ                                               */
/* En Final (MQXR_TERM) Cierre ordenado de Cola, Nunca desconectar */
/*           ya que ocasionaría el cierre del canal anticipadamente*/
/*           y podría ocasionar problemas indeterminados.(SOC4??)  */
/*           Esto viene asi  en el Manual de Intecomunicacion      */
/*           Nunca lo he probado                                   */
/*-----------------------------------------------------------------*/
/* Cabeceras estandar */
#include <stdio>
#include <stdlib>
#include <string>
#include <errno>
#include <spc>
#include <time>
/* Cabeceras WebSphere MQ*/
#include "cmqc.h"
#include "cmqxc.h"
/*INICIO MSJPRINTF escritura de Mensajes a SYSPRINT*/
#define MSJ_FILE     stdout
#define MSJPRINTF(msjtxt) { \
  time(&ltime); \
  acttime  = localtime(&ltime); \
  rcm = strftime(acttimec,sizeof(acttimec)-1,"%Y/%m/%d %H:%M:%S", \
        acttime); \
  fprintf msjtxt; \
                          }
/*FIN    MSJPRINTF*/


int       i=0,j=0,k=0;
MQCHAR    Queue[24]="\x0"; /* Cola Destino Max.24 caracteres*/
MQHCONN   hConn=0; 
MQLONG    Reason=0;
MQLONG    CompCode=0;
MQLONG    O_options=0;
MQLONG    C_options=0;
MQHOBJ    HobjPut=0;
MQOD      od =  {MQOD_DEFAULT};    /* Open Put                   */
MQMD      md =  {MQMD_DEFAULT};    /* Message Descriptor         */
MQPMO     pmo = {MQPMO_DEFAULT};   /* put message options        */
MQCHAR    QMgrName[7]="\x0"; /* Maximo 7 caracteres */
char      caracter[1]="\x0"; /* Lectura de MSGDATA */ 
long      DataLen=0;  
struct tm *acttime;
time_t ltime;
char   acttimec??(26??)  = "\x0";
short  rcm               = 0;

void MQENTRY MSGMONZ ( PMQCXP     pChannelExitParams,
                       PMQCD      pChannelDefinition,
                       PMQLONG    pDataLength,
                       PMQLONG    pAgentBufferLength,
                       PMQBYTE    AgentBuffer,
                       PMQLONG    pExitBufferLength,
                       PMQPTR     pExitBufferAddr)

{
 {
  switch( pChannelExitParams-> ExitReason )
  {
   case MQXR_INIT:
        if ( strlen(pChannelExitParams->ExitData) )
        {
         for (i=0;i<short>ExitData)-1;i++)
         {
          caracter[0] = pChannelExitParams->ExitData[i];
          if (memcmp(caracter,",",1) == 0) {j++;k=i+1;}
          if (j >  1) {break;}
          if (j == 0)
          {
           QMgrName[i] = caracter[0];  /*Nombre QMgr*/
          }
          if ((j == 1) && (memcmp(caracter,",",1) != 0))
          {
           Queue[i-k]  = caracter[0]; /*Nombre Cola */
          }
         }
/*Conexion */
         MQCONN(QMgrName,
                &hConn,
                &CompCode,
                &Reason);
/*si Conecto intento abrir Cola*/
         if (hConn !=0 )
         {
          od.ObjectType = MQOT_Q;
          strncpy(od.ObjectName, Queue, (size_t)MQ_Q_NAME_LENGTH);
          O_options = MQOO_OUTPUT+
                      MQOO_BIND_AS_Q_DEF+
                      MQOO_SET_ALL_CONTEXT+
                      MQOO_FAIL_IF_QUIESCING;
          MQOPEN(hConn,
                 &od,
                 O_options,
                 &HobjPut,
                 &CompCode,
                 &Reason);
         }
/*Si abri cola pongo opciones MQPUT y escribo exit activa */
         if (HobjPut != 0)
         {
          pmo.Options =   MQPMO_NO_SYNCPOINT +
                          MQPMO_SET_ALL_CONTEXT;
          MSJPRINTF((MSJ_FILE, \
          "MSGMONZ %s CHL:%s QMgr:%.6s COLA:%.20s EXIT activa\n",
           acttimec,pChannelDefinition->ChannelName,QMgrName,Queue));
         }
/* No pude abrir correctamente escribo exit NO ACTIVA*/
         else
         {
          MSJPRINTF((MSJ_FILE,
          "MSGMONZ %s CHL:%s QMgr:%.6s COLA:%.20s EXIT NO activa\n",
           acttimec,pChannelDefinition->ChannelName,QMgrName,Queue));
         }
        }
        break;
   case MQXR_MSG:
/* Si obtuve apertura correcta de la cola escribo*/
	   if (HobjPut != 0)
        {
         memcpy(&md,AgentBuffer+104,sizeof(MQMD1));
         MQPUT(hConn,
               HobjPut,
               &md,
               &pmo,
               (short)*pDataLength,
               (char *)AgentBuffer,
               &CompCode,
               &Reason);
        }
        break;
   case MQXR_TERM:
/* Cierro Cola normalizado NO DESCONECTO*/
	   if (HobjPut != 0)
        {
         MQCLOSE(hConn,
         &HobjPut,
         C_options,
         &CompCode,
         &Reason);
        }
        break;
   default:
        break;
  }
/*En cualquier caso siempre devuelvo OK al canal*/
  
 pChannelExitParams -> ExitResponse = MQXCC_OK;  /*siempre ok*/
 return;
}
/***-------------------------------------------------------------***/
Por favor, si encontrais algun error no dejeis de indicarmelo.
Saludos
No me sigas, puedo no guiarte, no vayas delante , puedo no seguirte, caminemos juntos y sé simplemente, mi amigo.

Responder