接触websphere MQ 已经两年了,现在才搞明白有两种读取数据的方式,感觉狠汗颜。压根都没想着去了解一下,这次彻底的去查阅了一下官方的资料,本文除了介绍对应的读取方式也会提供关键性的代码,给予参考。
- 第一种格式:破坏性读取
int openOptions = MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE;
// 打开队列
try {
mQueue = qMgr.accessQueue(this.queuename,openOptions);
logger.info("访问队列"+this.queuename);
} catch (MQException exp) {
logger.error(this.queuename+"队列访问失败",exp);
}
- 第二种格式:浏览性读取
采用浏览指针的方式获取队列中的信息,队列深度不减少,信息保留。
//浏览消息
int openOptions = MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_BROWSE;
// 打开队列
try {
mQueue = qMgr.accessQueue(this.queuename,openOptions);
logger.info("访问队列"+this.queuename);
} catch (MQException exp) {
logger.error(this.queuename+"队列访问失败",exp);
}
以上主要区别在队列AccessQueue的参数上,参数的详解:
MQC.MQOO_FAIL_IF_QUIESCING
IBM官方的文档描述:Fail if the queue manager is quiescing.
MQC.MQOO_BROWSE
IBM官方的文档描述:Open to browse message.
MQC.MQOO_INPUT_AS_Q_DEF
IBM官方的文档描述:Open to get messages using queue-defined default.
MQC.MQOO_OUTPUT
IBM官方的文档描述:Open to put messages.
MQC.MQOO_INQUIRE
IBM官方的文档描述:Open for inquiry - required if you want to query properties
- 破坏性读取
try {
int depth = this.getQueueDepth();
//将队列的里的消息读出来
if(depth>0)
{
MQMessage msg = new MQMessage();// 要读的队列的消息
MQGetMessageOptions gmo = new MQGetMessageOptions();
mQueue.get(msg, gmo);
logger.info("消息的大小为:"+msg.getDataLength());
System.out.println("---------------------------");
str=new byte[msg.getDataLength()];
msg.readFully(str);
msg.clearMessage();}
}
catch (MQException e)
{
logger.error(e);} catch (Exception e) {logger.error(e);}
- 浏览性读取
boolean firstBrowsed = false;
boolean isContinue = true;
while (isContinue)
{
MQMessage mqMsg; // MQMessage instance
MQGetMessageOptions mqGetMsgOpts; // MQGetMessageOptions instance
mqMsg = new MQMessage();
mqGetMsgOpts = new MQGetMessageOptions();
//mqGetMsgOpts.waitInterval = 15000; // 15 second limit for waiting
if (!firstBrowsed)
{
mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_FIRST;
}
else
{
mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_NEXT;
}
try
{
mQueue.get(mqMsg, mqGetMsgOpts);
firstBrowsed = true;
if (mqMsg.getMessageLength() > 0)
{
String str=mqMsg.readString(mqMsg.getMessageLength()));
}
}
catch (MQException mqe)
{
if (mqe.reasonCode != MQException.MQRC_NO_MSG_AVAILABLE)
{
try
{
qMgr.backout();
}
catch (MQException e)
{
// TODO Auto-generated catch block
//logger.error(e);
}
}
else
{
isContinue = false;
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
logger.error(interfacename+"没有消息到达!");
}
}
浏览消息就感觉是和链表(linkList)一样的原理,获取到队列的头后,采用link的方式获取下一条消息,一直到消息为空。