1. 用java介面怎麼取MQ隊列深度
不知道用的是什麼Mq框架,如果是IBM的mq,應該可以通過MQMannager的getTotalMessageLength,getMessageLength獲取
2. Java 開源消息隊列ActiveMQ等
你這個Queue是一個在內存里的數據結構類,提供了入隊出隊方法。實例化以後可以使用。
MessageQueue是一個Java的協議,是基於標準的,ActiveMQ是這個協議標準的具體實現。這個隊列具有MessageQueue的通用功能,例如支持:發布者-訂閱者,點到點的多種方式。用於SOA的大型分布式環境,12306搶票的時候你看見有多少人排隊等待,就是使用的這個。
12306的後台伺服器是分布式的,比如接受訂票功能有100台伺服器,一個LinkedBlockingQueue的范圍只是一台機器,這樣的話就會出現多個隊,而且功能單一。這時候就會把訂票請求發送給MessageQueue ,這個東西是分布式、非同步的。。。。是完全不同的兩個東西,沒有可比性
3. mq java 怎麼判斷隊列為空
MQException
該類包含WebSphere MQ 完成代碼和錯誤代碼常量的定義。以MQCC_開始的常量是WebSphere MQ 完成代碼,而以MQRC_開始的常量則是WebSphere MQ 原因代碼。只要出現WebSphere MQ
錯誤,就會給出MQException。
MQGetMessageOptions
該類包含控制MQQueue.get()方法行為的選項。
MQManagedObject
該類是MQQueueManager、MQQueue 和MQProcess 類的超類。它提供查詢並設置這些資源屬性的能力。
------解決方案--------------------
去取一次,得到 2033 錯誤就是沒有消息符合你的條件。
使用 PCF 查詢隊列資料:
/**
* @return current depth of queue connected currently.
* @throws Exception
*/
public QueueInfo queryQueueInfo() throws Exception {
if (!checkStatus2(this.queueManager)) {
throw new IllegalStateException("Not Connected to queue manager.");
}
PCFMessageAgent agent = null;
try {
agent = new PCFMessageAgent(this.queueManager);
// Inquiry Queue Name & Current Depth.
int[] attrs = {
CMQC.MQCA_Q_NAME, CMQC.MQIA_CURRENT_Q_DEPTH,
CMQC.MQIA_OPEN_INPUT_COUNT, CMQC.MQIA_OPEN_OUTPUT_COUNT,
CMQC.MQIA_Q_TYPE, CMQC.MQIA_DEFINITION_TYPE, CMQC.MQIA_INHIBIT_GET,
CMQC.MQIA_INHIBIT_PUT };
PCFParameter[] parameters = {
new MQCFST(CMQC.MQCA_Q_NAME , getInputQueue().getText().trim()),
new MQCFIL(CMQCFC.MQIACF_Q_ATTRS , attrs) };
// logger.log("Querying current depth of current queue.");
MQMessage[] responses = agent.send(CMQCFC.MQCMD_INQUIRE_Q, parameters);
QueueInfo info = new QueueInfo();
for (int i = 0; i < responses.length; i++) {
MQCFH cfh = new MQCFH(responses[i]);
// Check the PCF header (MQCFH) in the response message
if (cfh.reason == 0) {
String name = "";
Integer depth = new Integer(0);
for (int j = 0; j < cfh.parameterCount; j++) { // Extract what we want from the returned attributes
PCFParameter p = PCFParameter.nextParameter(responses[i]);
switch (p.getParameter()) {
case CMQC.MQCA_Q_NAME:
name = (String) p.getValue();
info.name = name;
break;
case CMQC.MQIA_CURRENT_Q_DEPTH:
depth = (Integer) p.getValue();
info.depth = depth.intValue();
break;
case CMQC.MQIA_OPEN_INPUT_COUNT:
Integer inputCount = (Integer) p.getValue();
info.inputCount = inputCount.intValue();
break;
case CMQC.MQIA_OPEN_OUTPUT_COUNT:
Integer outputCount = (Integer) p.getValue();
info.outputCount = outputCount.intValue();
break;
case CMQC.MQIA_Q_TYPE:
info.type = ((Integer) p.getValue()).intValue();
break;
case CMQC.MQIA_DEFINITION_TYPE:
info.definitionType = ((Integer) p.getValue()).intValue();
break;
case CMQC.MQIA_INHIBIT_PUT:
info.putNotAllowed = ((Integer) p.getValue()).intValue() == 1;
break; case CMQC.MQIA_INHIBIT_GET:
info.getNotAllowed = ((Integer) p.getValue()).intValue() == 1;
default:
}
}
// System.out.println("Queue " + name + " curdepth " + depth);
return info;
} else {
System.out.println("PCF error:\n" + cfh);
// Walk through the returned parameters describing the error
for (int j = 0; j < cfh.parameterCount; j++) {
System.out.println(PCFParameter.nextParameter(responses[0]));
}
throw new Exception("PCF Error [reason :" + cfh.reason + "]");
}
}
return null;
} catch (Exception e) {
throw e;
} finally {
if (agent != null) {
try {
agent.disconnect();
} catch (Exception e) {
logger.log(e);
}
}
}
4. 到底什麼是消息隊列Java中如何實現消息隊列
「消息隊列」是在消息的傳輸過程中保存消息的容器。和我們學過的LinkedHashMap,TreeSet等一樣,都是容器。既然是容器,就有有自己的特性,就像LinkedHashMap是以鍵值對存儲。存取順序不變。而消息隊列,看到隊列就可以知道。這個容器裡面的消息是站好隊的,一般遵從先進先出原則。
java中已經為我們封裝好了很多的消息隊列。在java 1.5版本時推出的java.util.concurrent中有很多現成的隊列供我們使用。特性繁多,種類齊全。是你居家旅遊開發必備QAQ。
下面簡單列舉這個包中的消息隊列
:阻塞隊列 BlockingQueue
數組阻塞隊列 ArrayBlockingQueue
延遲隊列 DelayQueue
鏈阻塞隊列 LinkedBlockingQueue
具有優先順序的阻塞隊列 PriorityBlockingQueue
同步隊列 SynchronousQueue
阻塞雙端隊列 BlockingDeque
鏈阻塞雙端隊列 LinkedBlockingDeque
不同的隊列不同的特性決定了隊列使用的時機,感興趣的話你可以詳細了解。具體的使用方式我就不贅述了
5. mq通道和隊列的關系
Mq通道和隊列屬於輔助的關系,他們兩個需要共同建立才可以更好的作用。
(5)javamq隊列擴展閱讀
一個隊列管理器可以有多個隊列和多個通道。
隊列管理器相當於RabbitMQ中的虛擬主機。
隊列分為本地隊列,遠程隊列,傳輸隊列。
通道分為發送通道、接收通道、伺服器通道等等。
發送到本地隊列上的消息存儲在本機上。
發送到遠程隊列上的消息,通過綁定傳輸隊列傳輸到別的隊列管理器上的本地隊列上存儲。
通道為消息進出隊列的渠道橋梁,發送通道只能出,接收通道只能進,伺服器通道可以進出。
本地例子:
發送消息===>Java程序===>伺服器通道===>本地隊列===>伺服器通道===>Python程序===>收到消息
兩家公司各自伺服器AB例子:
公司A發送消息===>Java程序===>伺服器通道A===>遠程隊列A>>>>傳輸隊列A>>>>發送通道A>>>>接收通道B>>>>本地隊列B===>伺服器通道B===>Python程序===>公司B收到消息===>響應===>響應消息發送===>Python程序===>伺服器通道B===>遠程隊列B>>>>傳輸隊列B>>>>發送通道B>>>>接收隊列A>>>>本地隊列A===>伺服器通道A===>Java程序===>公司A收到響應消息
6. Java里如何查詢MQ隊列屬性
你用的是IBM MQ還是Apache的? 一般通過JAVA的JMS可以取得。
例如IBM MQ里有個MQQueue 對象
// 獲取隊列實例
MQQueue queue = qMgr.accessQueue("TEST_QUEUE", openOptions);
//獲取當前隊列最長消息的長度
queue.getMaximumMessageLength()
//獲取當前隊列最長深度
queue.getMaximumMessageLength()
7. 請問用java連接MQ時,如何獲得某一個隊列管理器下所有隊列名稱。
引起這個問題一個很有可能的原因是隊列管理器在不正常停止後,雖然ps -ef | grep mq看不到此隊列管理器的進程,但此MQ隊列管理器的進程佔用的信號燈和共享內存卻沒有被釋放掉。解決辦法如下:
1. 先查看是否有此隊列管理器殘留的 信號燈和共享內存。命令如下:
ipcs -a | grep mq
2. 如果有,使用ipcrm命令清除 殘留的信號燈和共享內存,命令如下:
ipcrm -s <semphore id>
ipcrm -m <shared memory id >
3. 再次啟動MQ隊列管理器
8. 在JAVA開發中,如何查詢MQ中的隊列句柄狀態
你用的是IBM MQ還是Apache的? 一般通過JAVA的JMS可以取得。
例如IBM MQ里有個MQQueue 對象
// 獲取隊列實例
MQQueue queue = qMgr.accessQueue("TEST_QUEUE", openOptions);
//獲取當前隊列最長消息的長度
queue.getMaximumMessageLength()
//獲取當前隊列最長深度
queue.getMaximumMessageLength()
等等功能都是提供的,具體你下載個WebSphere MQ API 找到MQQueue一看便知。
9. MQ隊列可以存放java對象嗎
可以的. 序列化之後存放到mq上面去.
但是不建議使用序列化和反序列化的方式.
最簡單的一種方式把java對象轉成json字元串,存在mq上面.