|   | 
	 
  
    | 
RSS Feed - WebSphere MQ Support
 | 
RSS Feed - Message Broker Support
 |   
 
  
	     | 
	 | 
   
 
  
	|  Old data in message buffer on MQGET on z/OS | 
	« View previous topic :: View next topic »  | 
   
  
  	
	  
		
		
		  | Author | 
		  Message
		 |  
		
		  | Alyindar | 
		  
		    
			  
				 Posted: Mon Jan 05, 2015 1:32 pm    Post subject: Old data in message buffer on MQGET on z/OS | 
				     | 
			   
			 
		   | 
		 
		
		   Newbie
 
 Joined: 13 Mar 2008 Posts: 5
  
  | 
		  
		    
			  
				I did some searching but did not see a related topic, my apologies if I missed one.
 
 
I'm working with an ISPF panel that displays a list of messages on the queue from a program written in COBOL.  It strips away any extra headers and displays the first 40 characters of the message buffer.  Unfortunately, if subsequent messages are shorter than the previous, the data spills into the next one.  For example, I sent the following messages to a queue:
 
   
	| Code: | 
   
  
	The quick red fox
 
jumped over the
 
lazy brown dog | 
   
 
 
And here's the display:
 
   
	| Code: | 
   
  
	Format   Message  Message          
 
 Name     Length  Contents         
 
MQSTR          17 The quick red fox
 
MQSTR          15 jumped over theox
 
MQSTR          14 lazy brown dogeox | 
   
 
 
 
The impression I'm getting is that the MSGBUFFER is not being flushed between subsequent MQGETs, but this is not a problem I've had in writing batch applications.  Here's snippets of code where the buffer is defined and the MQGETs occur:
 
Working storage:
 
   
	| Code: | 
   
  
	01  W01-FORMATNAME              PIC X(8)   VALUE SPACES.
 
01  W01-MSGLEN                  PIC Z(7)9  VALUE SPACES.
 
01  W01-MSGBUFF                 PIC X(40)  VALUE SPACES.
 
 
01  W02-MSGBUFFER               PIC X(600) VALUE SPACES.
 
01  W02-DATALENGTH              PIC S9(09) BINARY.
 
01  W02-MAXMSGLENGTH            PIC 9(6) VALUE 600.
 
 
01  MQM-MESSAGE-DESCRIPTOR.
 
    COPY CMQMDV.
 
01  MQM-GET-MESSAGE-OPTIONS.
 
    COPY CMQGMOV. | 
   
 
 
 
Procedure division (first get happens outside of the loop with MQGMO-BROWSE-FIRST):
 
   
	| Code: | 
   
  
	MOVE MQMD-FORMAT TO W01-FORMATNAME
 
MOVE W02-DATALENGTH TO W01-MSGLEN
 
MOVE W02-MSGBUFFER TO W01-MSGBUFF
 
 
CALL 'ISPLINK' USING ITBADD IMSG-TABLE
 
 
COMPUTE MQGMO-OPTIONS = MQGMO-BROWSE-NEXT          +
 
                        MQGMO-NO-WAIT              +
 
                        MQGMO-ACCEPT-TRUNCATED-MSG +
 
                        MQGMO-CONVERT              +
 
                        MQGMO-NO-SYNCPOINT
 
MOVE MQMI-NONE TO MQMD-MSGID
 
MOVE MQCI-NONE TO MQMD-CORRELID
 
 
CALL 'MQGET' USING W01-HCONN
 
                   W01-HOBJ
 
                   MQMD
 
                   MQGMO
 
                   W02-MAXMSGLENGTH
 
                   W02-MSGBUFFER
 
                   W02-DATALENGTH
 
                   W02-COMPCODE
 
                   W02-REASON | 
   
 
 
 
W01-MSGBUFF, W01-MSGLEN AND W01-FORMATNAME are VDEFINE'd to the correlating fields in the panel:
 
   
	| Code: | 
   
  
	CALL 'ISPLINK' USING
 
       IVDEFINE IFORMATNAME   W01-FORMATNAME   ICHAR  I8.
 
CALL 'ISPLINK' USING
 
       IVDEFINE IMSGLEN       W01-MSGLEN       ICHAR  I8.
 
CALL 'ISPLINK' USING
 
       IVDEFINE IMSGBUFF      W01-MSGBUFF      ICHAR  I36.
 
 
CALL 'ISPLINK' USING ITBCREATE
 
                     IMSG-TABLE
 
                     IMSG-TABLE-KEY IMSG-TABLE-FIELDS
 
                     INOWRITE IREPLACE. | 
   
 
 
 
I can prevent the problem by adding a line "MOVE SPACES TO W02-MSGBUFFER" before the "CALL 'MQGET'" line, but I'm trying to understand why this step is necessary when I've not had these problems with batch programs (for example, the CSQ4BVJ1 sample program in SCSQCOBS).  Is there something specific to the MQ-ISPF relationship that I'm missing here?  Any advice is greatly appreciated! | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | tczielke | 
		  
		    
			  
				 Posted: Mon Jan 05, 2015 1:42 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		   Guardian
 
 Joined: 08 Jul 2010 Posts: 943 Location: Illinois, USA 
  | 
		  
		    
			  
				You should take into account the length of the message returned in the DATALENGTH field of the MQGET, and only print those number of bytes in your buffer.  Notice that the CSQ4BVJ1 sample program that you mentioned does that with reference modification:
 
 
   
	| Code: | 
   
  
	
 
DISPLAY W00-LOOP, ' : ', W00-DATALENGTH, ' : ',
 
             W00-MSGBUFFER(1:W00-DATALENGTH)    
 
 | 
   
 
 | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | bruce2359 | 
		  
		    
			  
				 Posted: Mon Jan 05, 2015 4:13 pm    Post subject: Re: Old data in message buffer on MQGET on z/OS | 
				     | 
			   
			 
		   | 
		 
		
		    Poobah
 
 Joined: 05 Jan 2008 Posts: 9486 Location: US: west coast, almost. Otherwise, enroute. 
  | 
		  
		    
			  
				
   
	| Alyindar wrote: | 
   
  
	
 
The impression I'm getting is that the MSGBUFFER is not being flushed between subsequent MQGETs, but this is not a problem I've had in writing batch applications.   | 
   
 
 
You are correct in that MQ internals do NOT initialize (flush or clear) your MSGBUFFER - this is a programmer responsibility.
 
 
A best-practice is for your app to have a virgin MQMD (from COPYBOOK) that you use to initialize (clear) your working MQMD before the next MQGET.  MOVE VIRGIN-MQMD TO MQM-MESSAGE-DESCRIPTOR. _________________ I like deadlines. I like to wave as they pass by.
 
ב''ה
 
Lex Orandi, Lex Credendi, Lex Vivendi. As we Worship, So we Believe, So we Live. | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | PaulClarke | 
		  
		    
			  
				 Posted: Mon Jan 05, 2015 9:49 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		    Grand Master
 
 Joined: 17 Nov 2005 Posts: 1002 Location: New Zealand 
  | 
		  
		    
			  
				When MQ gives you a message it always tells you how big it is. In other words, how many of the bytes in the message buffer are relevant. It would be unnecessary and woefully inefficient if MQ initialised your message buffer (lets say set them all to zeroes or blanks) for every MQGET call. Suppose the buffer you give is  100MB long - would you really want MQ to set 100 million bytes to zero each time you retrieved a single 10 byte message?
 
 
Cheers,
 
Paul. _________________ Paul Clarke
 
MQGem Software
 
www.mqgem.com | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | Alyindar | 
		  
		    
			  
				 Posted: Thu Jan 08, 2015 7:58 am    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		   Newbie
 
 Joined: 13 Mar 2008 Posts: 5
  
  | 
		  
		    
			  
				I missed that in the example, thanks for point that out tczielke.
 
 
I modified my program to use reference modification and everything is working perfectly.  Thanks for the explanations folks!  It's good to take off the sysadmin hat and don the programmer hat once in awhile, you just might learn something!    | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | 
		    
		   | 
		 
	   
	 | 
   
 
  
	     | 
	 | 
	Page 1 of 1 | 
   
 
 
 
  
  	
	  
		
		  
 
  | 
		  You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
  | 
  		 
	   
	 | 
   
 
  	 | 
	  |