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上面.