|
Marilyn,
Thinking this through as I type......
Have you considered "parsing" the MQ Message before placing it
in the array? In other words, MQSeries is passing your program
a message/string, not an array. Mapping output of your MQGET
instruction to the array or Data structure will be problematic
as you can't guarantee your XML "fragments" won't span multiple
elements. This would work if you were using fixed format, but
then why us XML.
Have you considered using allocated storage to receive the output
from MQGET (verses an array or DS)? From there you can use a variety
of methods (including XML parser) to extract your data.
Following is an example that "gets" message in browse mode, returning
them into a 10,000 byte allocated storage space. The program then
displays the returned string on STDOUT.
Hope this helps.
Michael Rooney
Citigroup International
H
*********************************************************************
* Bind with service program LIBMQM in library QMQM and
* service program QC2IO in QSYS library.
*********************************************************************
DMQSample PR
*
DMQGMO DS
D/COPY QMQM/QRPGLESRC,CMQGMOG
DMQMD DS
D/COPY QMQM/QRPGLESRC,CMQMDG
DMQOD DS
D/COPY QMQM/QRPGLESRC,CMQODG
*
DMQSample PI
*
/*********************************************************************/
/*
/* Compile using:
/*
/* CRTRPGMOD MODULE(MQSample)
/* CRTPGM PGM(MQSample) BNDSRVPGM(QMQM/LIBMQM QSYS/QC2IO)
/*
/*********************************************************************
*
Dprintf PR EXTPROC('printf')
D * value options(*string)
* Queue Manager Name
DQMgrName S 48A inz(*blank)
* Connection handle
DHconn S 10I 0
* Completion code
DCompCode S 10I 0
* Reason code qualifying CompCode
DReason S 10I 0
* Options that control the action of MQOPEN
DOptions S 10I 0
* Object handle for inquirying MQ Manager
DHobj S 10I 0
* Length of the message
DBufferLength S 10I 0
* Length of the message
DDataLength S 10I 0
* Selector Count for MQINQ
DReplyptr S *
*
C EVAL QMgrName = ' '
*
C MONITOR
*
C CALLP MQCONN(QMgrName:Hconn:CompCode:Reason)
*
C ON-ERROR
C callp printf('Error loading MQSeries Prod'+
C 'uct.....program terminating.' +
C x'15')
C move *on *inlr
C return
C ENDMON
*
C if CompCode = MQCC_FAILED
*
C callp printf('Program failed to connect to'+
C ' Queue Manager('+%trimr(QMgrName)+').' +
C ' Reason Code is '+%char(Reason)+'.'+
C x'15')
*
C callp printf('Program is terminating.' +
C x'15')
*
C move *on *inlr
C return
C endif
*
* Set Open Options to Input & Browse
*
C EVAL Options = (MQOO_BROWSE + MQOO_INPUT_AS_Q_DEF)
/* Get the queue name */
C EVAL ODON = 'SYSTEM.DEFAULT.LOCAL.QUEUE'
*
C EVAL ODOT = MQOT_Q
*
C CALLP MQOPEN(Hconn:MQOD:Options:Hobj:CompCode:
C Reason)
C CompCode IFEQ MQCC_FAILED
C callp printf('Program failed to open queue '+
C %trimr(ODON) +'.' + ' Reason Code is '+
C %char(Reason)+'.'+
C 'Program is terminating.' +
C x'15')
*
C move *on *inlr
C return
C endif
********************************************************************
* Prepare to Get Messages from Queue *
********************************************************************
*
* Define Message Buffer Length
*
C EVAL BufferLength = 10000
C eval Replyptr = %alloc(BufferLength)
*
C GetNxtMsg tag
*
* (re)Set Get Message Options to Accept Truncated Message, Fail if
Quiescing & Browse
*
C EVAL GMOPT = (64 + 8192 + 32)
*
* Initialize Message and Correlation Id (may have been modified by MQPUT).
*
C EVAL MDMID = MQMI_NONE
C EVAL MDCID = MQCI_NONE
*
* Execute MQGET in Browse Mode
*
C CALLP MQGET(Hconn:Hobj:MQMD:MQGMO:
C BufferLength:Replyptr:
C DataLength:CompCode:
C REASON)
*
C CompCode IFEQ MQCC_FAILED
C if REASON = MQRC_NO_MSG_AVAILABLE
C callp printf('Program completed!' +
C x'15')
*
C else
C callp printf('MQGET failed! '+
C 'Reason Code is '+
C
C %char(Reason)+'.'+
C 'Program is terminating.' +
C x'15')
*
C endif
*
C dealloc Replyptr
C move *on *inlr
C return
*
C endif
*
C callp printf(' ' +
C %str(Replyptr) +
C x'15')
*
C goto GetNxtMsg
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.