MainframeSupports
tip uge 32/2006:

For et stykke tid siden blev jeg spurgt om, hvad dead letter køen for en bestemt MQ hed. Jeg kendte ikke navnestandarden på den pågældende installation og måtte derfor melde pas. Så slog det mig, at det må man da kunne slå op. Det kan man selvfølgelig også, både med MQ administrationssystemet og via et program.

Lad os først tage det nemme, nemlig vha. kommandoen TSO MQM. Udfyld de forskellige MQ manager felter korrekt på det første panel. Herefter skal du sørge for at felt Action indeholder 1, felt Object type QMGR (eller MANAGER) og tryk Enter. På det næste panel står navnet på dead letter køen i feltet Dead-letter Queue. Du vil straks bemærke, at der er mange flere felter på panelet med forskellige oplysninger om queue manageren i. Du kan også bladre, så der er flere paneler med alskens mere eller mindre interessante oplysninger. Går du tilbage til indgangspanelet, så bemærk, at hvis du stiller cursoren i feltet Object type og trykker F4, så får du en liste over alle de mulige typer af oplysninger, du kan vride ud af MQ administrationssystemet. Det er ikke småting.

Du kan få fat i alle de oplysninger, som du kan se i MQ administrationssystemet fra et program ved at kalde funktionen MQINQ. Her er et eksempel på en PL/1 funktion, som returnerer navnet på dead letter køen for den MQ som programmet er connected til:

deadLetterQueue: PROC RETURNS(CHAR(48));

DCL mqrc FIXED BIN(31);
DCL mqreas FIXED BIN(31);
DCL options FIXED BIN(31);
DCL objdesc LIKE mqod;
DCL mqinqconnection FIXED BIN(31);
DCL mqinqobject FIXED BIN(31);
DCL selectorcount FIXED BIN(31);
DCL selectors(1) FIXED BIN(31);
DCL intattrcount FIXED BIN(31);
DCL intattr(1) FIXED BIN(31);
DCL charattrlength FIXED BIN(31);
DCL charattrs CHAR(48);

objdesc.objectname = '';
objdesc.objecttype = mqot_q_mgr; /* svarer til object type */
options = mqoo_inquire;
CALL mqopen(mqinqconnection, objdesc, options, mqinqobject, mqrc, mqreas);
selectorcount = 1;
selectors(1) = mqca_dead_letter_q_name; /* svarer til feltnavn */
intattrcount = 0;
intattr = 0;
charattrlength = 48;
CALL mqinq( mqinqconnection, mqinqobject
          , selectorcount, selectors, intattrcount, intattr
          , charattrlength, charattrs, mqrc, mqreas
          );
options = mqco_none;
CALL mqclose(mqinqconnection, mqinqobject, options, mqrc, mqreas);

RETURN(charattrs);

END deadLetterQueue;

For at ovenstående funktion kan virke, skal du huske de rigtige includes/copybooks (CMQP og CMEPP). I programmet skal du også lave en MQCONN, hvis du eksekverer programmet i batch eller fra TSO. Bemærk, at feltet objdesc.objecttype svarer til feltet Object type i TSO MQM. Det svære er, at finde den MQ variabel, der svarer til den Object type, du er interesseret i at finde oplysninger om. Her har jeg selvfølgelig anvendt den, der svarer til værdien QMGR. Man kan hente flere oplysninger med eet kald, men jeg har her valgt kun at hente een angivet med variablen selectorcount. Den oplysning, jeg er interesseret i, angiver jeg i variablen selectors(1). Her skal jeg anvende den MQ variabel, der svarer til feltet Dead-letter Queue. Resultatet af kaldet til MQINQ gemmes i variablen charattrs.

Jeg har for at forsimple eksemplet udeladt at kontrollere mqrc og mqreas efter hvert kald. Det skal du selvfølgelig huske at gøre. Du skal især huske at udføre en MQCLOSE efter MQINQ ellers risikerer du hurtigt at løbe ind i problemer. Du kan læse mere om MQINQ i manualen MQ application reference. Linket fører dig til den nyeste bookshelf med MQ manualer, som desværre kun er udgivet i PDF format. Derfor har jeg ikke noget link direkte til det rigtige kapitel, da det tager ret lang tid at downloade PDF udgaven.

Forrige danske tip        Last tip in english        Tip oversigten