接觸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的方式獲取下一條消息,一直到消息爲空。