MQ开发C教程

更新时间:2024-01-22 07:38:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MQ发送消息和接收消息例子, /////////////

//MQ初始化 MQHOBJ hObj;

MQLONG O_options, CompCode, Reason;

MQOD od = {MQOD_DEFAULT}; // Object Descriptor MQMD md = {MQMD_DEFAULT}; // Message Descriptor MQPMO pmo = {MQPMO_DEFAULT}; // put message options MQGMO gmo = {MQGMO_DEFAULT}; // get message options

memcpy(md.Format,MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);

strncpy(od.ObjectName, \(size_t)MQ_Q_NAME_LENGTH); O_options = MQOO_INPUT_AS_Q_DEF /* open queue for receive */ + MQOO_BROWSE

+ MQOO_FAIL_IF_QUIESCING; /* but not if MQM stopping */ MQOPEN(hConn, &od, O_options, &hObj, &CompCode, &Reason); if ( CompCode==MQCC_FAILED ) {

sprintf(sErrMsg, \打开队列: %s 失败, MQ_ERR_CODE: %d\Reason); return -1; }

//发送消息

md.Expiry = 60*10;

strncpy( od.ObjectName, \ //sMsgBuf 消息内容 piMsgLen 消息长度

MQPUT1(hConn, &od, &md, &pmo, *piMsgLen, sMsgBuf, &CompCode, &Reason); if(CompCode == MQCC_FAILED) {

sprintf(sErrMsg, \发送消息失败, MQ_ERR_CODE: %d\ if(hObj != MQHO_UNUSABLE_HOBJ)

MQCLOSE(hConn, &hObj, MQCO_NONE, &CompCode, &Reason); return -2; }

dwStartTime = GetTickCount(); Sleep(1000);

bGetFistMsg = TRUE;

memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));

memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));

md.Version = MQMD_VERSION_2 ; gmo.Version = MQGMO_VERSION_2; // gmo.Options = MQGMO_BROWSE_NEXT; //取回应消息 while(1) {

if(GetTickCount() - dwStartTime > (unsigned)iGetResExpiry*1000) break;

if(bGetFistMsg == TRUE) {

gmo.Options = MQGMO_BROWSE_FIRST; } else {

gmo.Options = MQGMO_BROWSE_NEXT; }

md.Encoding = MQENC_NATIVE; md.CodedCharSetId = MQCCSI_Q_MGR;

memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));

memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));

MQGET(hConn, hObj, &md, &gmo, MAX_THEEAD_BUF, sMsgBuf, (long *)piMsgLen, &CompCode, &Reason); if(CompCode==MQCC_FAILED) {

if(Reason==MQRC_NO_MSG_AVAILABLE) { Sleep(1000);

bGetFistMsg = TRUE;

// DisplayMsg(\无消息可取\ continue; }

else {

sprintf(sErrMsg, \取消息错误, MQ_ERR_CODE: %d\ if(hObj != MQHO_UNUSABLE_HOBJ)

MQCLOSE(hConn, &hObj, MQCO_NONE, &CompCode, &Reason); return -3; } }

//分析消息内容,如果是需要的回应,则取出 gmo.Options = MQGMO_MSG_UNDER_CURSOR;

MQGET(hConn, hObj, &md, &gmo, MAX_THEEAD_BUF, sMsgBuf, (long

*)piMsgLen, &CompCode, &Reason); if(CompCode==MQCC_FAILED) {

sprintf(sErrMsg, \取回应消息错误, MQ_ERR_CODE: %d\ if(hObj != MQHO_UNUSABLE_HOBJ)

MQCLOSE(hConn, &hObj, MQCO_NONE, &CompCode, &Reason); return -4; }

bGetFistMsg = FALSE;

Sleep(10); }

if(hObj != MQHO_UNUSABLE_HOBJ)

MQCLOSE(hConn, &hObj, MQCO_NONE, &CompCode, &Reason);

if(bGetResMsgSuc) return 0; else {

sprintf(sErrMsg, \取回应消息超时\ return -5; }

/////////////

索引消息格式vc例子: ///////////// head:

#define NULL_POINTER (void*)0L #define MAX_FILENAME_LENGTH 256 #define MAX_MQRMH_LENGTH 1000

typedef struct tagMQRMHX{ MQRMH ref;

MQCHAR SrcName[MAX_FILENAME_LENGTH];

MQCHAR DestName[MAX_FILENAME_LENGTH]; } MQRMHX;

int prmGetQMgrCCSID (MQCHAR48 QMgrName ,MQHCONN HConn

,PMQLONG pQMgrCCSID ); //////////// main:

MQOD od = {MQOD_DEFAULT}; /* Object Descriptor */

MQMD md = {MQMD_DEFAULT}; /* Message Descriptor */

MQPMO pmo = {MQPMO_DEFAULT}; /* put message options */

MQGMO gmo = {MQGMO_DEFAULT}; /* get message options */

MQRMHX refx = {{MQRMH_DEFAULT}}; /* reference message */

/** note, sample uses defaults where it can **/

MQHCONN Hcon; /* connection handle */

MQHOBJ Hobj = MQHO_UNUSABLE_HOBJ;

/* object handle */

MQLONG CompCode ; /* completion code */ //MQLONG OpenCompCode; /* MQOPEN completion code */

MQLONG ConnCode ; /* MQCONN completion code */ //int rc = 0; /* Return code */

MQLONG Reason; /* reason code */

MQLONG CReason; /* reason code for MQCONN */

//MQLONG oo; /* MQOPEN options */

MQLONG co = MQCO_NONE; /* MQCLOSE options */

MQLONG DataLength; /* Length of report message */

MQLONG WaitInterval = 15 ;

/* Wait interval */

MQLONG QMgrCCSID; /* QMgr CodedCharSetId */

PMQRMH pMQRMH; /* -> MQRMH structure */ PMQXQH pMQXQH; /* -> MQXQH structure */

char QMName[MQ_Q_MGR_NAME_LENGTH+1] = \

/* local queue manager name */

char DestQName[MQ_Q_NAME_LENGTH+1] = \ /* destination queue name */

// char DestQMName[MQ_Q_MGR_NAME_LENGTH+1] = \ /* destination qmgr name */

char SourceFileName[MAX_FILENAME_LENGTH+1] = \ /* source file name */

char TargetFileName[MAX_FILENAME_LENGTH+1] = \ /* target file name */

char ObjectType[sizeof(refx.ref.ObjectType)]; /* Object type */

char Buffer[sizeof(MQXQH)+MAX_MQRMH_LENGTH];

strcpy(QMName, sMQManager);

strcpy(DestQName, sMQSendQueue); strcpy(SourceFileName, sFileName); strcpy(TargetFileName, sFileName);

MQCONN( QMName /* queue manager */ ,&Hcon /* connection handle */

,&ConnCode /* completion code */

,&CReason ); /* reason code */

CompCode = ConnCode;

if (CompCode == MQCC_FAILED)

{

cout << \ return -1; }

rc = prmGetQMgrCCSID(QMName ,Hcon

,&QMgrCCSID );

if (rc != 0) {

cout << \ goto EXIT; }

// strncpy(od.ObjectName // ,\

// ,(size_t)MQ_Q_NAME_LENGTH // );

// oo = MQOO_FAIL_IF_QUIESCING + // MQOO_INPUT_AS_Q_DEF;

// MQOPEN(Hcon /* connection handle */

// ,&od /* object descriptor for queue */

// ,oo /* options */

// ,&Hobj /* object handle */

// ,&OpenCompCode /* MQOPEN completion code */

// ,&Reason); /* reason code */

// if( OpenCompCode == MQCC_FAILED && Reason != MQRC_NONE ) // {

// cout << \// goto EXIT; // }

// cout << \

memset(ObjectType,' ',sizeof(ObjectType));

memcpy(ObjectType, \

refx.ref.StrucLength = sizeof(refx); refx.ref.Encoding = MQENC_NATIVE; refx.ref.CodedCharSetId = QMgrCCSID; memcpy(refx.ref.Format,MQFMT_STRING ,(size_t)MQ_FORMAT_LENGTH);

refx.ref.Flags = MQRMHF_LAST; memcpy(refx.ref.ObjectType,ObjectType, sizeof(refx.ref.ObjectType));

memset(refx.SrcName ,' '

,sizeof(refx.SrcName)+sizeof(refx.DestName));

memcpy(refx.SrcName ,SourceFileName

,strlen(SourceFileName) );

memcpy(refx.DestName ,TargetFileName

,strlen(TargetFileName) );

refx.ref.SrcNameLength = strlen(SourceFileName); refx.ref.SrcNameOffset = offsetof(MQRMHX,SrcName);

refx.ref.DestNameLength = strlen(TargetFileName); refx.ref.DestNameOffset = offsetof(MQRMHX,DestName);

memcpy(md.ReplyToQ ,\

, strlen( \ );

strncpy(od.ObjectName ,DestQName

,sizeof(od.ObjectName) );

/* strncpy(od.ObjectQMgrName , \

, strlen( \

);

strncpy(md.ReplyToQMgr , \

, strlen( \ ); */

md.Report = MQRO_COA_WITH_FULL_DATA + MQRO_EXCEPTION_WITH_FULL_DATA;

pmo.Options = MQPMO_FAIL_IF_QUIESCING; memcpy(md.Format,MQFMT_REF_MSG_HEADER ,(size_t)MQ_FORMAT_LENGTH);

// md.Report = MQRO_COA + MQRO_EXCEPTION;

MQPUT1(Hcon, /* connection handle */

&od, /* object descriptor for queue */

&md, /* message descriptor */

&pmo, /* options */

sizeof(refx), /* buffer length */

&refx, /* buffer */

&CompCode, /* MQPUT1 completion code */

&Reason); /* reason code */

if (Reason != MQRC_NONE) {

cout << \

rc = -1; goto EXIT; }

else cout << \发送索引消息成功!\//////////////// UNIX分段发送例子

char sFilePath[300]; char sErrMsg[1024] = \ int nRec = 0; //

//MQMD mqMd;

//MQ初始化 MQHCONN hConn;

MQLONG CompCode, Reason;

MQOD od = {MQOD_DEFAULT}; // Object Descriptor MQMD md = {MQMD_DEFAULT}; // Message Descriptor MQPMO pmo = {MQPMO_DEFAULT}; // put message options

memcpy(md.Format,MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH); MQAgent agent; int agentRec;

agentRec = agent.Init(sMQManager, &hConn); if ( agentRec != 0 ) {

cout<<\连接队列管理器失败\ goto EXIT1; } //

GetPrivateProfileString(\sFilePath, 100, \ strcat(sFilePath, sFileName);

nRec = agent.PutFile(sMQSendQueue, sFilePath); if(nRec != 0) {

sprintf(sErrMsg, \发送文件(%s)失败-->%s\sFilePath,agent.m_strErrText);

cout<

sprintf(sErrMsg, \发送文件(%s)成功------\ cout<

EXIT1:

if(hConn != MQHC_UNUSABLE_HCONN) MQDISC(&hConn, &CompCode, &Reason);

////////////////////////////

int prmGetQMgrCCSID (MQCHAR48 QMgrName ,MQHCONN HConn

,PMQLONG pQMgrCCSID ) {

int rc = 0; /* Function return code */ MQLONG CompCode; MQLONG Reason;

MQOD ObjDesc = {MQOD_DEFAULT}; /* Object descriptor */ MQLONG Selectors[1]; MQLONG flags; MQHOBJ Hobj;

/********************************************************************/

/* Open the queue manager

object */

/********************************************************************/

ObjDesc.ObjectType = MQOT_Q_MGR; memcpy(ObjDesc.ObjectQMgrName ,QMgrName

,MQ_Q_MGR_NAME_LENGTH );

flags = MQOO_INQUIRE;

MQOPEN(HConn ,&ObjDesc ,flags ,&Hobj ,&CompCode ,&Reason );

if (CompCode == MQCC_FAILED) {

cout << \ rc = -1;

goto MOD_EXIT; }

/********************************************************************/ /* Use MQINQ to get the queue manager CCSID */ /********************************************************************/

Selectors[0] = MQIA_CODED_CHAR_SET_ID;

MQINQ(HConn ,Hobj

,1 /* Number of selectors */ ,Selectors

,1 /* Number of integer selectors */ ,pQMgrCCSID

,0 /* length of character attributes */

,NULL /* character attributes */ ,&CompCode ,&Reason );

if (CompCode == MQCC_FAILED) {

cout << \ rc = -1;

goto MOD_EXIT; }

MOD_EXIT:

if (Hobj != MQHO_UNUSABLE_HOBJ) {

MQCLOSE(HConn ,&Hobj ,MQCO_NONE ,&CompCode ,&Reason ); }

return rc; }

-----------------------

msgexit.dll 存放路径:$MQ安装路径 \\IBM\\WebSphere MQ\\Exits

系统环境变量 FILE_DIRECTORY_VAR 值:文件存放路径.

本文来源:https://www.bwwdw.com/article/4wpo.html

Top