如何以 java 取得 data queue 的所有屬性?(Retreive data queue description with API QMHQRDQD)
RtvDtaqD.java
/* ==================================================================*/
/* */
/* Program . . : RtvDtaqD.java */
/* Description : Retrieve data queue description */
/* Author . . : Vengoal Chang */
/* Published . : AS400ePaper */
/* Date . . . : December 23, 2014 */
/* */
/* ==================================================================*/
package com.free400.vengoal.as400api;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Bin4;
import com.ibm.as400.access.AS400Exception;
import com.ibm.as400.access.AS400Text;
import com.ibm.as400.access.CharConverter;
import com.ibm.as400.access.DateTimeConverter;
import com.ibm.as400.access.ProgramCall;
import com.ibm.as400.access.ProgramParameter;
import com.ibm.as400.access.ServiceProgramCall;
import com.ibm.as400.access.Trace;
public class RtvDtaqD {
private static final int PAD_LIMIT = 8192;
private static final AS400Bin4 intConverter_ = new AS400Bin4();
public static Calendar cal = Calendar.getInstance();
public static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private static ProgramParameter[] buildProgramParameters(AS400 as400, String dtaqname, String dtaqlib) throws Exception {
ProgramParameter[] parameterList = new ProgramParameter[4];
parameterList[0] = new ProgramParameter(120);
parameterList[1] = new ProgramParameter(intConverter_.toBytes(120));
AS400Text text8 = new AS400Text(8, as400);
parameterList[2] = new ProgramParameter(text8.toBytes("RDQD0100"));
AS400Text text20 = new AS400Text(20, as400);
byte[] dtaqNameLibBytes = text20.toBytes(padRight(dtaqname, 10) + padRight(dtaqlib, 10));
parameterList[3] = new ProgramParameter(dtaqNameLibBytes);
return parameterList;
}
private static void rtvDtaqDesc(AS400 as400, String dtaqname, String dtaqlib){
try{
CharConverter charConverter = new CharConverter(as400.getCcsid(), as400);
ProgramParameter[] parameters = buildProgramParameters(as400, dtaqname, dtaqlib);
ProgramCall rtvDtaqPgmDCall = new ProgramCall(as400, "/QSYS.LIB/QMHQRDQD.PGM", parameters);
//Trace.setTraceAllOn(true);
//Trace.setTraceOn(true);
if (rtvDtaqPgmDCall.run() != true) {
throw new AS400Exception(rtvDtaqPgmDCall.getMessageList());
} else {
byte[] rcvVar = parameters[0].getOutputData();
int maxentlen = intConverter_.toInt(rcvVar, 8);
System.out.println("Maximum entry length: " + maxentlen );
int keylen = intConverter_.toInt(rcvVar, 12);
System.out.println("Key length: " + keylen );
String sequence = charConverter.byteArrayToString(rcvVar, 16, 1);
System.out.println("Sequence: " + sequence );
String senderid = charConverter.byteArrayToString(rcvVar, 17, 1);
System.out.println("Include sender ID: " + senderid );
String forceindicator = charConverter.byteArrayToString(rcvVar, 18, 1);
System.out.println("Force indicator: " + forceindicator );
String text = charConverter.byteArrayToString(rcvVar, 19, 50);
System.out.println("Text: " + text );
String typeOfDq = charConverter.byteArrayToString(rcvVar, 69, 1);
System.out.println("Type of data queue: " + typeOfDq );
String autoReclaim = charConverter.byteArrayToString(rcvVar, 70, 1);
System.out.println("Automatic Reclaim: " + autoReclaim );
String eforceDqLck = charConverter.byteArrayToString(rcvVar, 71, 1);
System.out.println("Enforce data queue locks: " + eforceDqLck );
int nbrOfMsg = intConverter_.toInt(rcvVar, 72);
System.out.println("Number of messages: " + nbrOfMsg );
int nbrOfMsgAlc = intConverter_.toInt(rcvVar, 76);
System.out.println("Number of entries currently allocated: " + nbrOfMsgAlc );
String dqname = charConverter.byteArrayToString(rcvVar, 80, 10);
System.out.println("Data queue name used: " +dqname );
String dqlib = charConverter.byteArrayToString(rcvVar, 90, 10);
System.out.println("Data queue library used: " + dqlib );
int maxNbrOfEntAlw = intConverter_.toInt(rcvVar, 100);
System.out.println("Maximum number of entries allowed: " + maxNbrOfEntAlw );
int inlNbrOfEnt = intConverter_.toInt(rcvVar, 104);
System.out.println("Initial number of entries: " + inlNbrOfEnt );
int maxNbrOfEntSpc = intConverter_.toInt(rcvVar, 108);
System.out.println("Maximum number of entries specified: " + maxNbrOfEntSpc );
DateTimeConverter dtc = new DateTimeConverter(as400);
// System current date and time
byte[] systemDtsByte = new byte[8];
System.arraycopy(rcvVar, 112, systemDtsByte, 0, 8);
Date sysDate = dtc.convert(systemDtsByte, "*DTS");
String systemTimeStr=null;
if (sysDate != null){
cal.setTime(sysDate);
systemTimeStr = df.format(cal.getTime());
}
System.out.println("Last reclaim date and time: " + systemTimeStr );
}
} catch(Exception e){
e.printStackTrace();
}
}
public static String padRight(String s, int n) {
return String.format("%1$-" + n + "s", s);
}
public static void main(String[] args) {
AS400 as400 = new AS400("as400ip", "user", "password");
rtvDtaqDesc(as400, "DTAQ", "QGPL");
}
}
參照: Retrieve Data Queue Description (QMHQRDQD) API
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期四, 11月 09, 2023
2014-12-23 如何以 java 取得 data queue 的所有屬性?(Retreive data queue description with API QMHQRDQD)
2013-09-14 擷取 Data queue 物件定義 command RTVDTAQD(Command RTVDTAQD with Retrieve Data Queue Description (QMHQRDQD) API)
擷取 Data queue 物件定義 command RTVDTAQD(Command RTVDTAQD with Retrieve Data Queue Description (QMHQRDQD) API)
File : QCLSRC
Member: RTVDTAQD
Type : CLP
Usage : CRTCLPGM RTVDTAQD
/*-------------------------------------------------------------------*/
/* */
/* Program . . : RTVDTAQD CPP */
/* Description : Retrieve data queue description */
/* Author . . : Vengoal Chang */
/* Published . : AS400ePaper */
/* Date . . . : September 11,2013 */
/* Date Changed: September 16,2013 add parameter RclTime */
/* */
/* Program function: RTVDTAQD command processing program */
/* */
/* */
/* Program summary */
/* --------------- */
/* */
/* Work management APIs: */
/* QMHQRDQD Retrieve data queue description */
/* */
/* QWCCVTDT Convert Date and Time Format */
/* */
/* Compile options: */
/* CrtClPgm Pgm( RTVDTAQD ) */
/* SrcFile( QCLSRC ) */
/* SrcMbr( *PGM ) */
/* */
/*-------------------------------------------------------------------*/
Pgm ( &FullDtaQ +
&RtnLib +
&Type +
&MaxLen +
&Force +
&Seq +
&KeyLen +
&SndrId +
&MaxEntSpc +
&MaxNbrEnt +
&InlNbrEnt +
&AutoRcl +
&Text +
&CurNbrAlc +
&NbrOfEnt +
&EnFrcLock +
&RclTime +
&RmtDtaq +
&RmtDtaqL +
&RmtLocName +
&Dev +
&LclLocName +
&Mode +
&RmtNetId +
&RmtDbName +
)
Dcl &FullDtaq *Char 20
Dcl &Dtaq *Char 10
Dcl &Lib *Char 10
Dcl &RtnLib *Char 10
Dcl &RtnLibp *Char 10
Dcl &Type *Char 4
Dcl &Typep *Char 4
Dcl &MaxLen *Dec ( 5 0 )
Dcl &MaxLenp *Dec ( 5 0 )
Dcl &Force *Char 4
Dcl &Forcep *Char 4
Dcl &Seq *Char 6
Dcl &Seqp *Char 6
Dcl &KeyLen *Dec ( 5 0 )
Dcl &KeyLenp *Dec ( 5 0 )
Dcl &SndrId *Char 4
Dcl &SndrIdp *Char 4
Dcl &NbrOfEnt *Dec ( 9 0 )
Dcl &NbrOfEntp *Dec ( 9 0 )
Dcl &CurNbrAlc *Dec ( 9 0 )
Dcl &CurNbrAlcp *Dec ( 9 0 )
Dcl &MaxNbrEntp *Dec ( 9 0 )
Dcl &MaxNbrEnt *Dec ( 9 0 )
Dcl &InlNbrEntp *Dec ( 9 0 )
Dcl &InlNbrEnt *Dec ( 9 0 )
Dcl &MaxEntSpcp *Dec ( 9 0 )
Dcl &MaxEntSpc *Char 9
Dcl &AutoRcl *Char 4
Dcl &AutoRclp *Char 4
Dcl &EnFrcLock *Char 4
Dcl &EnFrcLockp *Char 4
Dcl &Text *Char 50
Dcl &Textp *Char 50
Dcl &RclTime *Char 20
Dcl &RclTimep *Char 20
Dcl &Textp *Char 50
Dcl &DtsNULL *Char 8 X'0000000000000000'
Dcl &RclDts *Char 8
/* Format RDQD0200 fields */
Dcl &RmtDtaq *Char 10
Dcl &RmtDtaqp *Char 10
Dcl &RmtDtaqL *Char 10
Dcl &RmtDtaqLp *Char 10
Dcl &RmtLocName *Char 8
Dcl &RmtLocNamp *Char 8
Dcl &Dev *Char 10
Dcl &Devp *Char 10
Dcl &LclLocName *Char 8
Dcl &LclLocNamp *Char 8
Dcl &Mode *Char 8
Dcl &Modep *Char 8
Dcl &RmtNetId *Char 8
Dcl &RmtNetIdp *Char 8
Dcl &RmtDbName *Char 18
Dcl &RmtDbNamep *Char 18
Dcl &RcvR *Char 120
Dcl &RcvRLen *Char 4
MonMsg CPF0000 *N GoTo Error
ChgVar &Dtaq %SST( &FullDtaq 1 10 )
ChgVar &Lib %SST( &FullDtaq 11 10 )
ChkObj Obj(&Lib/&Dtaq) ObjType(*Dtaq)
IF (( &Lib *EQ '*LIBL' ) *OR +
( &Lib *EQ '*CURLIB' )) Do
RtvObjD Obj(&Lib/&Dtaq) ObjType(*DTAQ) RtnLib(&LIB)
EndDo
ChgVar %BIN( &RcvrLen 1 4 ) 120
/* Get format RDQD0100 fields */
Call QMHQRDQD ( &RcvR +
&RcvRLen +
RDQD0100 +
&FullDtaq +
)
ChgVar &MaxLenp %BIN( &Rcvr 9 4 )
If ( %SST(&RcvR 17 1) *EQ 'K' ) DO
ChgVar &KeyLenp %BIN( &RcvR 13 4 )
ChgVar &Seqp '*KEYED'
EndDo
Else Do
If ( %SST(&RcvR 17 1) *EQ 'L' ) +
ChgVar &Seqp '*LIFO'
Else +
ChgVar &Seqp '*FIFO'
EndDo
If ( %SST(&RcvR 18 1) *EQ 'N' ) +
ChgVar &SndrIdp '*NO'
Else Do
If ( %SST(&RcvR 18 1) *EQ 'Y' ) +
ChgVar &SndrIdp '*YES'
EndDo
If ( %SST(&RcvR 19 1) *EQ 'N' ) +
ChgVar &Forcep '*NO'
Else Do
If ( %SST(&RcvR 19 1) *EQ 'Y' ) +
ChgVar &Forcep '*YES'
EndDo
If ( %SST(&RcvR 70 1) *EQ '0' ) +
ChgVar &Typep '*STD'
Else +
ChgVar &Typep '*DDM'
If ( %SST(&RcvR 71 1) *EQ '0' ) +
ChgVar &AutoRclp '*NO'
Else Do
If ( %SST(&RcvR 71 1) *EQ '1' ) +
ChgVar &AutoRclp '*YES'
EndDo
If ( %SST(&RcvR 72 1) *EQ '0' ) +
ChgVar &EnFrcLockp '*NO'
Else Do
If ( %SST(&RcvR 72 1) *EQ '1' ) +
ChgVar &EnFrcLockp '*YES'
EndDo
ChgVar &NbrOfEntp %BIN( &RcvR 73 4 )
ChgVar &CurNbrAlcp %BIN( &RcvR 77 4 )
ChgVar &MaxNbrEntp %BIN( &RcvR 101 4 )
ChgVar &InlNbrEntp %BIN( &RcvR 105 4 )
ChgVar &Textp %SST( &RCVR 20 50 )
ChgVar &MaxEntSpcp %BIN( &RcvR 109 4 )
If ( &MaxEntSpcp *EQ -1 ) Do
ChgVar &MaxEntSpc '*MAX16MB'
MonMsg MsgId(MCH3601)
EndDo
Else Do
If ( &MaxEntSpcp *EQ -2 ) Do
ChgVar &MaxEntSpc '*MAX2GB'
MonMsg MsgId(MCH3601)
EndDo
EndDo
If ( &MaxEntSpcp *EQ 0 ) Do
ChgVar &MaxEntSpc ' '
MonMsg MsgId(MCH3601)
EndDo
ChgVar &RclDts %SST(&RCVR 113 8)
If (&RclDts *NE &DtsNull) Do
Call QWCCVTDT ( '*DTS' +
&RclDts +
'*YYMD' +
&RclTimep +
x'00000000' +
)
EndDo
ChgVar &RtnLib &Lib
MonMsg MsgId(MCH3601)
ChgVar &Type &Typep
MonMsg MsgId(MCH3601)
ChgVar &MaxLen &MaxLenp
MonMsg MsgId(MCH3601)
ChgVar &Force &Forcep
MonMsg MsgId(MCH3601)
ChgVar &Seq &Seqp
MonMsg MsgId(MCH3601)
ChgVar &KeyLen &KeyLenp
MonMsg MsgId(MCH3601)
ChgVar &SndrId &SndrIdp
MonMsg MsgId(MCH3601)
ChgVar &MaxNbrEnt &MaxNbrEntp
MonMsg MsgId(MCH3601)
ChgVar &InlNbrEnt &InlNbrEntp
MonMsg MsgId(MCH3601)
ChgVar &AutoRCL &AutoRCLp
MonMsg MsgId(MCH3601)
ChgVar &Text &Textp
MonMsg MsgId(MCH3601)
ChgVar &NbrOfEnt &NbrOfEntp
MonMsg MsgId(MCH3601)
ChgVar &CurNbrAlc &CurNbrAlcp
MonMsg MsgId(MCH3601)
ChgVar &EnFrcLock &EnFrcLockp
MonMsg MsgId(MCH3601)
ChgVar &RclTime &RclTimep
MonMsg MsgId(MCH3601)
If (&Type *EQ '*DDM') Do
/* Get format RDQD0200 fields */
ChgVar &RcvR *BLANKS
ChgVar %BIN( &RcvrLen 1 4 ) 120
Call QMHQRDQD ( &RcvR +
&RcvRLen +
RDQD0200 +
&FullDtaq +
)
ChgVar &RmtDtaqp %SST( &RCVR 51 10 )
ChgVar &RmtDtaqLp %SST( &RCVR 61 10 )
ChgVar &RmtLocNamp %SST( &RCVR 27 8 )
ChgVar &Devp %SST( &RCVR 9 10 )
ChgVar &LclLocNamp %SST( &RCVR 35 8 )
ChgVar &Modep %SST( &RCVR 19 8 )
ChgVar &RmtNetIdp %SST( &RCVR 43 8 )
ChgVar &RmtDbNamep %SST( &RCVR 91 18 )
ChgVar &RmtDtaq &RmtDtaqp
MonMsg MsgId(MCH3601)
ChgVar &RmtDtaqL &RmtDtaqLp
MonMsg MsgId(MCH3601)
ChgVar &RmtLocName &RmtLocNamp
MonMsg MsgId(MCH3601)
ChgVar &Dev &Devp
MonMsg MsgId(MCH3601)
ChgVar &LclLocName &LclLocNamp
MonMsg MsgId(MCH3601)
ChgVar &Mode &Modep
MonMsg MsgId(MCH3601)
ChgVar &RmtNetId &RmtNetIdp
MonMsg MsgId(MCH3601)
ChgVar &RmtDbName &RmtDbNamep
MonMsg MsgId(MCH3601)
EndDo
Return
Error:
Call QMHMOVPM ( ' ' +
'*DIAG' +
x'00000001' +
'*PGMBDY' +
x'00000001' +
x'0000000800000000' +
)
Call QMHRSNEM ( ' ' +
x'0000000800000000' +
)
EndPgm:
EndPgm
File : QPNLSRC
Member: RTVDTAQDH
Type : PNLGRP
Usage : CRTPNLGRP PNLGRP(RTVDTAQDH)
.*-----------------------------------------------------------------------**
.*
.* Compile options:
.*
.* CrtPnlGrp PnlGrp( RTVDTAQDH )
.* SrcFile( QPNLSRC )
.* SrcMbr( *PNLGRP )
.*
.*-----------------------------------------------------------------------**
:PNLGRP.
:HELP NAME='RTVDTAQD'.Retrieve Data Queue Desc - Help
:P.
The Retrieve Data Queue Desc (RTVDTAQD) command returns information
about specified data queue description.
:P.
The data queue description retrieved with API QMHQRDQD format RDQD0100
and RDQD0200.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/DTAQ'.Data queue(DTAQ) - Help
:XH3.Data queue(DTAQ)
:P.
Specifies which data queue whose description should be returned.
:EHELP.
:HELP NAME='RTVDTAQD/RTNLIB'.CL var for RTNLIB (10) (RTNLIB) - Help
:XH3.CL var for RTNLIB (10) (RTNLIB)
:P.
Specifies a 10-character variable used to return the name of the library
that contains the object.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/TYPE'.CL var for TYPE (4) (TYPE) - Help
:XH3.CL var for TYPE (4) (TYPE)
:P.
Specifies the name of a variable used to retrieve the data queue type.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*STD':DD.Local data queue.
:DT.'*DDM':DD.Remote data queue.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXLEN'.CL var for MAXLEN (5 0) (MAXLEN) - Help
:XH3.CL var for MAXLEN (5 0) (MAXLEN)
:P.
Specifies the name of a variable used to retrieve the maximum entry length.
:P.
In CL programs, this should be a 5-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/FORCE'.CL var for FORCE (4) (FORCE) - Help
:XH3.CL var for FORCE (4) (FORCE)
:P.
Specifies the name of a variable used to retrieve whether force to auxiliary
storage or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.Send and receive operations are immediately forced to storage.
:DT.'*NO' :DD.Send and receive operations are not immediately forced to storage.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/SEQ' .CL var for SEQ (6) (SEQ) - Help
:XH3.CL var for SEQ (6) (SEQ)
:P.
Specifies the name of a variable used to retrieve the sequence in which
entries are received from data queue.
:P.
In CL programs, this should be a 6-character variable.
:P.
Possible return values:
:DL.
:DT.'*FIFO':DD.
:DT.'*LIFO':DD.
:DT.'*KEYED':DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/KEYLEN'.CL var for KEYLEN (5 0) (KEYLEN) - Help
:XH3.CL var for KEYLEN (5 0) (KEYLEN)
:P.
Specifies the name of a variable used to retrieve the number of
characters in the key.
:P.
In CL programs, this should be a 5-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/SENDERID'.CL var for SENDERID (4) (SENDERID) - Help
:XH3.CL var for SENDERID (4) (SENDERID)
:P.
Specifies the name of a variable used to retrieve whether include sender ID
or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXENTSPC'.CL var for MAXENTSPC (9) (MAXENTSPC)- Help
:XH3.CL var for MAXENTSPC (9) (MAXENTSPC)
:P.
Specifies the name of a variable used to retrieve the maximum number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-character variable.
:P.
Possible return values:
:DL.
:DT.'*MAX16MB':DD.
:DT.'*MAX2GB':DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXNBRENT'.CL var for MAXNBRENT (9 0) (MAXNBRENT)- Help
:XH3.CL var for MAXNBRENT (9 0) (MAXNBRENT)
:P.
Specifies the name of a variable used to retrieve the maximum number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/INLNBRENT'.CL var for INLNBRENT (9 0) (INLNBRENT)- Help
:XH3.CL var for INLNBRENT (9 0) (INLNBRENT)
:P.
Specifies the name of a variable used to retrieve the initial number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/AUTORCL'.CL var for AUTORCL (4) (AUTORCL) - Help
:XH3.CL var for AUTORCL (4) (AUTORCL)
:P.
Specifies the name of a variable used to retrieve whether automatic reclaim
or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/TEXT'.CL var for TEXT (50) (TEXT) - Help
:XH3.CL var for TEXT (50) (TEXT)
:P.
Specifies the name of a variable used to retrieve the data queue
text description.
:P.
In CL programs, this should be a 50-character variable.
:EHELP.
:HELP NAME='RTVDTAQD/NBROFALC'.CL var for NBROFALC (9 0) (NBROFALC) - Help
:XH3.CL var for NBROFALC (9 0) (NBROFALC)
:P.
Specifies the name of a variable used to retrieve the number of entries
currently allocated.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/NBROFENT'.CL var for NBROFENT (9 0) (NBROFENT) - Help
:XH3.CL var for NBROFENT (9 0) (NBROFENT)
:P.
Specifies the name of a variable used to retrieve the number of entries
currently in the data queue.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/ENFRCLOCK'.CL var for ENFRCLOCK (4) (ENFRCLOCK) - Help
:XH3.CL var for ENFRCLOCK (4) (ENFRCLOCK)
:P.
An optional return variable that will contain a *YES or *NO for whether
an IBM supported data queue will enforce a lock. This value cannot be
specified on CRTDTAQ.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/LASTRCLTIM'.CL var for LASTRCLTIM (20) (LASTRCLTIM) - Help
:XH3.CL var for LASTRCLTIM (20) (LASTRCLTIM)
:P.
An optional return variable that will contain last reclaim date and
time with format YYYYMMDDHHmmSSsss.
:P.
In CL programs, this should be a 20-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDTAQ'.CL var for RMTDTAQ (10) (RMTDTAQ) - Help
:XH3.CL var for RMTDTAQ (10) (RMTDTAQ)
:P.
An optional return variable that will contain. For TYPE(*STD) data queue,
this field will be blank.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDTAQL'.CL var for RMTDTAQL (10) (RMTDTAQL) - Help
:XH3.CL var for RMTDTAQL (10) (RMTDTAQL)
:P.
An optional return variable that will contain the name of the remote data
queue library. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTLOCNAME'.CL var for RMTLOCNAME (8) (RMTLOCNAME) - Help
:XH3.CL var for RMTLOCNAME (8) (RMTLOCNAME)
:P.
An optional return variable that will contain the name of the remote location
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/DEV'.CL var for DEV (8) (DEV) - Help
:XH3.CL var for DEV (8) (DEV)
:P.
An optional return variable that will contain the name of the APPC device
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/LCLLOCNAME'.CL var for LCLLOCNAME (8) (LCLLOCNAME) - Help
:XH3.CL var for LCLLOCNAME (8) (LCLLOCNAME)
:P.
An optional return variable that will contain the name of the local location
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/MODE'.CL var for MODE (8) (MODE) - Help
:XH3.CL var for MODE (8) (MODE)
:P.
An optional return variable that will contain the mode.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTNETID'.CL var for RMTNETID (8) (RMTNETID) - Help
:XH3.CL var for RMTNETID (8) (RMTNETID)
:P.
An optional return variable that will contain remote network identifier.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDBNAME'.CL var for RMTDBNAME (18) (RMTDBNAME) - Help
:XH3.CL var for RMTDBNAME (18) (RMTDBNAME)
:P.
An optional return variable that will contain remote database name.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 18-character variable.
:P.
:EHELP.
:EPNLGRP.
File : QCMDSRC
Member: RTVDTAQD
Type : CMD
Usage : CRTCMD CMD(RTVDTAQD) PGM(RTVDTAQD)
/* =============================================================== */
/* = Command....... RTVDTAQD = */
/* = CPP........... RTVDTAQD CLP = */
/* = = */
/* = Description... = */
/* = Retrieve data queue description command retrieves the = */
/* = attributes of a data queue (not the entries) = */
/* = the API QMHQRDQD is used. = */
/* = = */
/* = CrtCmd Cmd( RtvDtaqD ) = */
/* = Pgm( RtvDtaqD ) = */
/* = SrcFile( YourSourceFile ) = */
/* = Allow ( *Ipgm *Bpgm ) = */
/* = HlpPnlGrp( RTVDTAQDH ) = */
/* = HlpId( *CMD ) = */
/* =============================================================== */
/* = Date : 2013/09/11 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
/* = Date modify: 2013/09/16 add parameter LASTRCLTIM = */
/* =============================================================== */
Cmd Prompt( 'Rtv Data Queue Description' )
Parm Kwd( Dtaq ) +
Type( Qual1 ) +
Min( 1 ) +
Prompt('Data queue' )
Parm Kwd( RtnLib ) +
Type( *Char ) +
Len( 10 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RTNLIB (10) .' )
/* =============================================================== */
/* = Type - Type of data queue = */
/* = *STD, *DDM = */
/* =============================================================== */
Parm Kwd( Type ) +
Type( *Char ) +
Len( 4 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for TYPE (4) .' )
/* =============================================================== */
/* = MaxLen- Maximum entry length = */
/* =============================================================== */
Parm Kwd( MaxLen ) +
Type( *Dec ) +
Len( 5 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for MAXLEN (5 0) .' )
/* =============================================================== */
/* = Force - Force to auxiliary storage = */
/* = *YES, *NO = */
/* =============================================================== */
Parm Kwd( Force ) +
Type( *Char ) +
Len( 4 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for FORCE (4) .' )
/* =============================================================== */
/* = Seq - *FIFO, *LIFO, *KEYED = */
/* =============================================================== */
Parm Kwd( Seq ) +
Type( *Char ) +
Len( 6 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for SEQ (6) .' )
/* =============================================================== */
/* = KeyLen- Key length = */
/* =============================================================== */
Parm Kwd( KeyLen ) +
Type( *Dec ) +
Len( 5 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for KEYLEN (5 0) .' )
/* =============================================================== */
/* = SenderId - Include sender ID = */
/* = *YES, *NO = */
/* =============================================================== */
Parm Kwd( SenderId ) +
Type( *Char ) +
Len( 4 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for SENDERID (4) .' )
/* =============================================================== */
/* = MaxEntSpc- Maximum number of entries specified = */
/* = *MAX16MB, *MAX2GB = */
/* =============================================================== */
Parm Kwd( MaxEntSpc ) +
Type( *Char ) +
Len( 9 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for MAXENTSPC (9) .' )
/* =============================================================== */
/* = MaxNbrEnt- Maximum number of entries alloweded = */
/* =============================================================== */
Parm Kwd( MaxNbrEnt ) +
Type( *Dec ) +
Len( 9 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for MAXNBRENT (9 0) .' )
/* =============================================================== */
/* = InlNbrEnt- Initial number of entries = */
/* =============================================================== */
Parm Kwd( InlNbrEnt ) +
Type( *Dec ) +
Len( 9 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for INLNBRENT (9 0) .' )
/* =============================================================== */
/* = AutoRcl - Automatic Reclaim = */
/* = *YES, *NO = */
/* =============================================================== */
Parm Kwd( AutoRcl ) +
Type( *Char ) +
Len( 4 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for AUTORCL (4) .' )
Parm Kwd( Text ) +
Type( *Char ) +
Len( 50 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for TEXT (50) .' )
/* =============================================================== */
/* = NbrOfAlc - Number of entries currently allocated = */
/* =============================================================== */
Parm Kwd( NbrOfAlc ) +
Type( *Dec ) +
Len( 9 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for NBROFALC (9 0) .' )
/* =============================================================== */
/* = NbrOfMsg - Number of entries currently = */
/* =============================================================== */
Parm Kwd( NbrOfEnt ) +
Type( *Dec ) +
Len( 9 0 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for NBROFENT (9 0) .' )
/* =============================================================== */
/* = EnFrcLock- Enforce lock = */
/* = *YES, *NO = */
/* =============================================================== */
Parm Kwd( EnFrcLock ) +
Type( *Char ) +
Len( 4 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for ENFRCLOCK (4) .' )
/* =============================================================== */
/* = LastRclTim - Last reclaim date and time = */
/* =============================================================== */
Parm Kwd( LastRclTim ) +
Type( *Char ) +
Len( 20 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for LASTRCLTIM (20) .' )
Parm Kwd( RmtDtaq ) +
Type( *Char ) +
Len( 10 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RMTDTAQ (10) .' )
Parm Kwd( RmtDtaqL ) +
Type( *Char ) +
Len( 10 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RMTDTAQL (10) .' )
Parm Kwd( RmtLocName ) +
Type( *Char ) +
Len( 8 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RMTLOCNAME (8) .' )
Parm Kwd( Dev ) +
Type( *Char ) +
Len( 10 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for DEV (10) .' )
Parm Kwd( LclLocName ) +
Type( *Char ) +
Len( 8 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for LCLLOCNAME (8) .' )
Parm Kwd( Mode ) +
Type( *Char ) +
Len( 8 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for MODE (8) .' )
Parm Kwd( RmtNetId ) +
Type( *Char ) +
Len( 8 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RMTNETID (8) .' )
Parm Kwd( RmtDbName ) +
Type( *Char ) +
Len( 18 ) +
Rtnval( *Yes ) +
Prompt( 'CL var for RMTDBNAME (18) .' )
Qual1: Qual Type( *Name ) +
Expr( *Yes )
Qual Type( *Name ) +
Dft( *Libl ) +
Spcval(( *Libl ) ( *CurLib )) +
Expr( *Yes ) +
Prompt( 'Library' )
參考資訊:
Retrieve Data Queue Description (QMHQRDQD) API
星期一, 11月 06, 2023
2004-03-01 如何取得某一 Data Queue 的定義(API QMHQRDQD)
如何取得某一 Data Queue 的定義(API QMHQRDQD)
有時候要利用 Data Queue 來完成程式間的資訊交換,但是又會忘記所產生的 Data Queue 定義,
如Data Queue 中每一筆 Entry 的長度,這個長度與程式將資料寫入Data Queue有關,若寫入長度
超過當初產生(CRTDTAQ) Data Queue 的定義長度時,程式會有警告訊息,但程式不會當掉,但是
資訊又寫不進 Data Queue,此時就比較難
Debug,所以需要取得 Data Queue 的定義來判斷。 OS/400 提供一個 API QMHQRDQD 即可以符
合此需求。
此範例會顯示所指定的 Data Queue 當初所產生 Data Queue 指令的定義於畫面第 24 行,
可以將游標移至 24 行,按 F1 顯示該 Data queue 當初所執行的指令詳細資訊。
File : QCLSRC
Member: RTVDTAQDC
Type : CLP
Usage : CRTCLPGM RTVDTAQDC
CALL RTVDTAQDC ('dataqueue library ')
參數長度 20,前十位為 Data Queue 名稱,後十位為Data Queue 所在的 Library
PGM (&DTAQ)
DCL &DTAQ *CHAR 20
DCL &MAXLEN *CHAR 5
DCL &MAXLENN *DEC (5 0)
DCL &FORCE *CHAR 4
DCL &SEQ *CHAR 6
DCL &KEYLEN *CHAR 4 VALUE('*N')
DCL &SENDRID *CHAR 4
DCL &TEXT *CHAR 50
DCL &RCVRLEN *CHAR 4
DCL &RCVR *CHAR 80
DCL &MSGTEXT *CHAR 250
CHGVAR %BIN(&RCVRLEN 1 4) 80
/* CHGVAR &DTAQ ('DATAQUEUE LIBRARY ') */
/*****************************************************************/
/* RETREIVE DATA QUEUE ATTRIBUTES */
/*****************************************************************/
CALL QMHQRDQD (&RCVR &RCVRLEN RDQD0100 &DTAQ)
MONMSG CPF0000 EXEC(CALL QMHRSNEM (' ' X'00000000'))
/*****************************************************************/
/* SET VARIABLES FOR CRTDTAQ PARAMETERS FROM THE DATA QUEUE */
/* ATTRIBUTES FROM QMHQRDQD. */
/*****************************************************************/
CHGVAR &MAXLEN %BIN(&RCVR 9 4)
CHGVAR &MAXLENN &MAXLEN
IF (%SST(&RCVR 17 1) *EQ 'K') +
DO
CHGVAR &KEYLEN %BIN(&RCVR 13 4)
CHGVAR &SEQ *KEYED
ENDDO
ELSE IF (%SST(&RCVR 17 1) *EQ 'L') CHGVAR &SEQ *LIFO
ELSE CHGVAR &SEQ *FIFO
IF (%SST(&RCVR 18 1) *EQ 'N') CHGVAR &SENDRID *NO
ELSE CHGVAR &SENDRID *YES
IF (%SST(&RCVR 19 1) *EQ 'N') CHGVAR &FORCE *NO
ELSE CHGVAR &FORCE *YES
CHGVAR &TEXT %SST(&RCVR 20 50)
/*****************************************************************/
/* CREATE THE NEW DATA QUEUE */
/*****************************************************************/
CHGVAR VAR(&MSGTEXT) VALUE( +
'DATA QUEUE CREATING COMMAND AS FOLLOWING: ' *CAT +
'CRTDTAQ DTAQ(' *CAT %SST(&DTAQ 11 10) *TCAT '/' *CAT +
%SST(&DTAQ 1 10) *TCAT ')' *BCAT +
'MAXLEN(' *CAT &MAXLEN *TCAT ')' *BCAT +
'FORCE(' *CAT &FORCE *TCAT ')' *BCAT +
'SEQ(' *CAT &SEQ *TCAT ')' *BCAT +
'KEYLEN(' *CAT &KEYLEN *TCAT ')' *BCAT +
'SENDERID(' *CAT &SENDRID *TCAT ')' *BCAT +
'TEXT(' *CAT &TEXT *TCAT ')')
SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
MSGDTA(&MSGTEXT) MSGTYPE(*COMP)
/* ? CRTDTAQ (%SST(&DTAQ 11 10)/%SST(&DTAQ 1 10)) +
MAXLEN(&MAXLEN) FORCE(&FORCE) SEQ(&SEQ) KEYLEN(&KEYLEN) +
SENDERID(&SENDRID) TEXT(&TEXT) */
MONMSG CPF0000 EXEC(CALL QMHRSNEM (' ' X'00000000'))
ENDPGM
執行結果如下(將游標移至 24 行,按 F1 顯示):
Additional Message Information
Message ID . . . . . . : CPF9897 Severity . . . . . . . : 40
Message type . . . . . : Information
Date sent . . . . . . : 03/01/04 Time sent . . . . . . : 13:16:23
Message . . . . : DATA QUEUE CREATING COMMAND AS FOLLOWING:
CRTDTAQ DTAQ(LIBRARY/DTAQ) MAXLEN(05400) FORCE(*NO) SEQ(*FIFO) KEYLEN(*N)
SENDERID(*NO) TEXT()
Cause . . . . . : No additional online help information is available.
訂閱:
文章 (Atom)