|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
Resize buffer |
« View previous topic :: View next topic » |
Author |
Message
|
megani |
Posted: Thu Aug 07, 2003 8:53 am Post subject: Resize buffer |
|
|
Apprentice
Joined: 19 Dec 2001 Posts: 27
|
Hello, I'm modifying the amqsget program. The declared buffer is
MQBYTE buffer[101]. I'm continually getting truncated message error.
I know one trick is to get the length of the failed MQGet call and issue the call with the new length.
I make buflen = messlen but
In code how would I resize the buffer variable.
Thank you |
|
Back to top |
|
 |
jefflowrey |
Posted: Thu Aug 07, 2003 9:16 am Post subject: Re: Resize buffer |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
megani wrote: |
Hello, I'm modifying the amqsget program. The declared buffer is
MQBYTE buffer[101]. I'm continually getting truncated message error.
I know one trick is to get the length of the failed MQGet call and issue the call with the new length.
I make buflen = messlen but
In code how would I resize the buffer variable.
|
What language are you working in? C? On what platform?
If you are working in plain C, then you don't resize a variable generally. You create a new buffer of the right size, and change the buffer pointer to reference the new buffer. This is a standard operation in C that has nothing to do with MQSeries buffers, so if you need help you should consult a C manual. |
|
Back to top |
|
 |
bduncan |
Posted: Thu Aug 07, 2003 2:21 pm Post subject: |
|
|
Padawan
Joined: 11 Apr 2001 Posts: 1554 Location: Silicon Valley
|
Or if you just want the quick and dirty approach, just set the initial buffer size to something very big, which you are fairly sure one of your messages will never exceed.
I wouldn't recommend this for a production system, but if you are just playing around with the amqsget source code this approach works fine. _________________ Brandon Duncan
IBM Certified MQSeries Specialist
MQSeries.net forum moderator |
|
Back to top |
|
 |
RogerLacroix |
Posted: Thu Aug 07, 2003 10:20 pm Post subject: |
|
|
 Jedi Knight
Joined: 15 May 2001 Posts: 3264 Location: London, ON Canada
|
Ok, here is amqsget0.c with only a few lines changed to support large message sizes. I have coded the buffer size (buflen) to be 4MB. If you want to change the size (smaller or larger) then just change the buflen value to be whatever you want.
Copy the code below, compile it and you should be good to go.
later
Roger...
Code: |
/********************************************************************/
/* */
/* Program name: AMQSGET0 */
/* */
/* Description: Sample C program that gets messages from */
/* a message queue (example using MQGET) */
/* <START_COPYRIGHT> */
/* Licensed Materials - Property of IBM */
/* */
/* 5724-B41 */
/* (C) Copyright IBM Corp. 1994, 2002 All Rights Reserved. */
/* */
/* US Government Users Restricted Rights - Use, duplication or */
/* disclosure restricted by GSA ADP Schedule Contract with */
/* IBM Corp. */
/* <END_COPYRIGHT> */
/********************************************************************/
/* */
/* Function: */
/* */
/* */
/* AMQSGET0 is a sample C program to get messages from a */
/* message queue, and is an example of MQGET. */
/* */
/* -- sample reads from message queue named in the parameter */
/* */
/* -- displays the contents of the message queue, */
/* assuming each message data to represent a line of */
/* text to be written */
/* */
/* messages are removed from the queue */
/* */
/* -- writes a message for each MQI reason other than */
/* MQRC_NONE; stops if there is a MQI completion code */
/* of MQCC_FAILED */
/* */
/* */
/* Program logic: */
/* Take name of input queue from the parameter */
/* MQOPEN queue for INPUT */
/* while no MQI failures, */
/* . MQGET next message, remove from queue */
/* . print the result */
/* . (no message available counts as failure, and loop ends) */
/* MQCLOSE the subject queue */
/* */
/* */
/********************************************************************/
/* */
/* AMQSGET0 has the following parameters */
/* required: */
/* (1) The name of the source queue */
/* optional: */
/* (2) Queue manager name */
/* (3) The open options */
/* (4) The close options */
/* */
/********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* includes for MQI */
#include <cmqc.h>
int main(int argc, char **argv)
{
/* Declare MQI structures needed */
MQOD od = {MQOD_DEFAULT}; /* Object Descriptor */
MQMD md = {MQMD_DEFAULT}; /* Message Descriptor */
MQGMO gmo = {MQGMO_DEFAULT}; /* get message options */
/** note, sample uses defaults where it can **/
MQHCONN Hcon; /* connection handle */
MQHOBJ Hobj; /* object handle */
MQLONG O_options; /* MQOPEN options */
MQLONG C_options; /* MQCLOSE options */
MQLONG CompCode; /* completion code */
MQLONG OpenCode; /* MQOPEN completion code */
MQLONG Reason; /* reason code */
MQLONG CReason; /* reason code for MQCONN */
char *pBuffer; /* point to buffer */
MQLONG buflen = 4*1024*1024; /* 4MB size */
MQLONG messlen; /* message length received */
char QMName[50]; /* queue manager name */
printf("Sample AMQSGET0 start\n");
if (argc < 2)
{
printf("Required parameter missing - queue name\n");
exit(99);
}
/******************************************************************/
/* */
/* Create object descriptor for subject queue */
/* */
/******************************************************************/
strcpy(od.ObjectName, argv[1]);
QMName[0] = 0; /* default */
if (argc > 2)
strcpy(QMName, argv[2]);
/******************************************************************/
/* */
/* Connect to queue manager */
/* */
/******************************************************************/
MQCONN(QMName, /* queue manager */
&Hcon, /* connection handle */
&CompCode, /* completion code */
&CReason); /* reason code */
/* report reason and stop if it failed */
if (CompCode == MQCC_FAILED)
{
printf("MQCONN ended with reason code %d\n", CReason);
exit( (int)CReason );
}
/******************************************************************/
/* */
/* Open the named message queue for input; exclusive or shared */
/* use of the queue is controlled by the queue definition here */
/* */
/******************************************************************/
if (argc > 3)
{
O_options = atoi( argv[3] );
printf("open options are %d\n", O_options);
}
else
{
O_options = MQOO_INPUT_AS_Q_DEF /* open queue for input */
| MQOO_FAIL_IF_QUIESCING /* but not if MQM stopping */
; /* = 0x2001 = 8193 decimal */
}
MQOPEN(Hcon, /* connection handle */
&od, /* object descriptor for queue */
O_options, /* open options */
&Hobj, /* object handle */
&OpenCode, /* completion code */
&Reason); /* reason code */
/* report reason, if any; stop if failed */
if (Reason != MQRC_NONE)
{
printf("MQOPEN ended with reason code %d\n", Reason);
}
if (OpenCode == MQCC_FAILED)
{
printf("unable to open queue for input\n");
}
/******************************************************************/
/* */
/* Get messages from the message queue */
/* Loop until there is a failure */
/* */
/******************************************************************/
CompCode = OpenCode; /* use MQOPEN result for initial test */
/******************************************************************/
/* Use these options when connecting to Queue Managers that also */
/* support them, see the Application Programming Reference for */
/* details. */
/* These options cause the MsgId and CorrelId to be replaced, so */
/* that there is no need to reset them before each MQGET */
/******************************************************************/
/*gmo.Version = MQGMO_VERSION_2;*/ /* Avoid need to reset Message */
/*gmo.MatchOptions = MQMO_NONE; */ /* ID and Correlation ID after */
/* every MQGET */
gmo.Options = MQGMO_WAIT /* wait for new messages */
+ MQGMO_CONVERT; /* convert if necessary */
gmo.WaitInterval = 15000; /* 15 second limit for waiting */
pBuffer = malloc( buflen + 1); /* allocate the buffer for the get */
while (CompCode != MQCC_FAILED)
{
memset(pBuffer, '\0', buflen); /* clear the buffer */
/****************************************************************/
/* The following two statements are not required if the MQGMO */
/* version is set to MQGMO_VERSION_2 and and gmo.MatchOptions */
/* is set to MQGMO_NONE */
/****************************************************************/
/* */
/* In order to read the messages in sequence, MsgId and */
/* CorrelID must have the default value. MQGET sets them */
/* to the values in for message it returns, so re-initialise */
/* them before every call */
/* */
/****************************************************************/
memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));
memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));
/****************************************************************/
/* */
/* MQGET sets Encoding and CodedCharSetId to the values in */
/* the message returned, so these fields should be reset to */
/* the default values before every call, as MQGMO_CONVERT is */
/* specified. */
/* */
/****************************************************************/
md.Encoding = MQENC_NATIVE;
md.CodedCharSetId = MQCCSI_Q_MGR;
MQGET(Hcon, /* connection handle */
Hobj, /* object handle */
&md, /* message descriptor */
&gmo, /* get message options */
buflen, /* pBuffer length */
pBuffer, /* pointer to message buffer */
&messlen, /* message length */
&CompCode, /* completion code */
&Reason); /* reason code */
/* report reason, if any */
if (Reason != MQRC_NONE)
{
if (Reason == MQRC_NO_MSG_AVAILABLE)
{ /* special report for normal end */
printf("no more messages\n");
}
else /* general report for other reasons */
{
printf("MQGET ended with reason code %d\n", Reason);
/* treat truncated message as a failure for this sample */
if (Reason == MQRC_TRUNCATED_MSG_FAILED)
{
CompCode = MQCC_FAILED;
}
}
}
/****************************************************************/
/* Display each message received */
/****************************************************************/
if (CompCode != MQCC_FAILED)
{
pBuffer[messlen] = '\0'; /* add terminator */
printf("message <%s>\n", pBuffer);
}
}
free(pBuffer); /* get rid of the buufer */
/******************************************************************/
/* */
/* Close the source queue (if it was opened) */
/* */
/******************************************************************/
if (OpenCode != MQCC_FAILED)
{
if (argc > 4)
{
C_options = atoi( argv[4] );
printf("close options are %d\n", C_options);
}
else
{
C_options = MQCO_NONE; /* no close options */
}
MQCLOSE(Hcon, /* connection handle */
&Hobj, /* object handle */
C_options,
&CompCode, /* completion code */
&Reason); /* reason code */
/* report reason, if any */
if (Reason != MQRC_NONE)
{
printf("MQCLOSE ended with reason code %d\n", Reason);
}
}
/******************************************************************/
/* */
/* Disconnect from MQM if not already connected */
/* */
/******************************************************************/
if (CReason != MQRC_ALREADY_CONNECTED )
{
MQDISC(&Hcon, /* connection handle */
&CompCode, /* completion code */
&Reason); /* reason code */
/* report reason, if any */
if (Reason != MQRC_NONE)
{
printf("MQDISC ended with reason code %d\n", Reason);
}
}
/******************************************************************/
/* */
/* END OF AMQSGET0 */
/* */
/******************************************************************/
printf("Sample AMQSGET0 end\n");
return(0);
}
|
_________________ Capitalware: Transforming tomorrow into today.
Connected to MQ!
Twitter |
|
Back to top |
|
 |
megani |
Posted: Fri Aug 08, 2003 2:20 pm Post subject: |
|
|
Apprentice
Joined: 19 Dec 2001 Posts: 27
|
Thanks very much Roger, very kind of you.
Regards. |
|
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
|
|
|
|