MQ队列管理
分享一段代码,很实用。
下面这段java代码是我在国外一个论坛上发现的,源地址已经忘了。代码的作用是可以删除正在使用的mq的队列消息,管理mq的人一定知道它的美妙了吧,哈哈。
我拿来改了下,增加了2个参数支持:ccsid和channel。上代码:
import java.util.Hashtable;
import com.ibm.mq.*; /**
* A simply Java class to destructively read (delete) all message on a queue.
*
* @author Roger Lacroix, Capitalware Inc.
* @return 0 for ok or 1 for failed.
* @version 1.0.0
* @license Apache 2 License
*/ /**
* lichmama reedited
* change: add parameters to set ccsid and channel
*/ public class EmptyQ
{
private Hashtable params = null;
public int port = 1414;
public String hostname;
public String channel;
public String qManager;
public String inputQName;
public int ccsid = 1208; /**
* The constructor
*/
public EmptyQ()
{
super();
} /**
* Check if all of the parameters were passed to the class file.
* @return true/false
*/
private boolean allParamsPresent()
{
boolean b = params.containsKey("-s") && params.containsKey("-h") && params.containsKey("-p") && params.containsKey("-c") && params.containsKey("-m") && params.containsKey("-q");
if (b)
{
try
{
port = Integer.parseInt((String) params.get("-p"));
ccsid = Integer.parseInt((String) params.get("-s"));
}
catch (NumberFormatException e)
{
b = false;
}
// Set up MQ environment
hostname = (String) params.get("-h");
channel = (String) params.get("-c");
qManager = (String) params.get("-m");
inputQName = (String) params.get("-q"); }
return b;
} /**
* Initialize MQ environment variables
* @param args
* @throws IllegalArgumentException
*/
private void init(String[] args) throws IllegalArgumentException
{
params = new Hashtable(5);
if (args.length > 0 && (args.length % 2) == 0)
{
for (int i = 0; i < args.length; i += 2)
params.put(args[i], args[i + 1]);
}
else
{
throw new IllegalArgumentException();
}
if (allParamsPresent())
{
// Set up MQ environment
MQEnvironment.hostname = hostname;
MQEnvironment.channel = channel;
MQEnvironment.port = port;
//CCSID: DIS QMGR CCSID
MQEnvironment.CCSID = ccsid;
MQException.log = null; /* Tell MQ client library not to output anything. */
}
else
{
throw new IllegalArgumentException();
}
} /**
* Main entry point.
* @param args
*/
public static void main(String[] args)
{ EmptyQ readQ = new EmptyQ(); try
{
readQ.init(args);
readQ.emptyIt();
}
catch (IllegalArgumentException e)
{
System.err.println("Usage: java EmptyQ <-s ccsid> <-h host> <-p port> <-c channel> <-m QueueManagerName> <-q QueueName>");
System.exit(1);
}
} /**
* Connect to a queue manager, open a queue then destructively get (delete)
* all messages on the queue.
*/
private void emptyIt()
{
boolean loopAgain = true;
MQQueueManager _queueManager = null;
MQQueue queue = null;
int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED;
System.out.println("EmptyQ v1.0.0 by Capitalware Inc.");
try
{
_queueManager = new MQQueueManager(qManager);
System.out.println("EmptyQ: Connected to queue manager "+qManager); try
{
queue = _queueManager.accessQueue(inputQName, openOptions, null, null, null);
System.out.println("EmptyQ: Opened queue "+inputQName); int depth = queue.getCurrentDepth();
System.out.println("EmptyQ: Current depth: " + depth); MQGetMessageOptions getOptions = new MQGetMessageOptions();
getOptions.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING + MQC.MQGMO_ACCEPT_TRUNCATED_MSG; MQMessage message;
while (loopAgain)
{
message = new MQMessage();
try
{
queue.get(message, getOptions, 1);
}
catch (MQException e)
{
if (e.completionCode == 1 && e.reasonCode == MQException.MQRC_TRUNCATED_MSG_ACCEPTED)
{
// Just what we expected!!
}
else
{
loopAgain = false;
if (e.completionCode == 2 && e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE)
{
// Good, we are now done - no error!!
}
else
{
System.err.println("EmptyQ: MQException: " + e.getLocalizedMessage());
}
}
}
}
System.out.println("EmptyQ: Queue emptied.");
}
catch (MQException e1)
{
System.err.println("EmptyQ: MQException: " + e1.getLocalizedMessage());
}
finally
{
if (queue != null)
{
queue.close();
System.out.println("EmptyQ: Closed queue "+inputQName);
} if (_queueManager != null)
{
_queueManager.disconnect();
System.out.println("EmptyQ: Disconnect from "+qManager);
}
}
}
catch (MQException e1)
{
System.err.println("EmptyQ: MQException: " + e1.getLocalizedMessage());
}
}
}
下面,再贴一个我用shell写的壳:
#!/bin/bash
# File: clearMQ.sh
# Whatfor:empty the queue's curdepth WHEN IT OVERSTOCKS,
# and all the performance depends on EmptyQ.class,
# which [@author Roger Lacroix, Capitalware Inc.] made it.thx this guy:)
# Auth: nextgodhand@163.com
# Usage: ./clearMQ.sh <QueueManagerName> <QueueName> [CHANNEL_NAME]
# #set user env.
#. ~/.bash_profile if [ $# -lt ]; then
echo "Usage: $0 <QueueManagerName> <QueueName> [CHANNEL_NAME]"
exit
fi QMGR=$
QNME=$
CHNN=$ if [ -z "`dspmq|grep "$QMGR"`" ]; then
echo "Error: $QMGR not running."
exit
fi if [ -z "`echo "DIS QUEUE(*)"|runmqsc $QMGR|grep "($QNME)"`" ]; then
echo "Error: $QNME not exists in $QMGR."
exit
fi if [ -z "$CHNN" ]; then
CHNN="SYSTEM.ADMIN.SVRCONN"
fi CCSID=`echo "DIS QMGR CCSID"|runmqsc $QMGR|grep -oE "CCSID\([0-9]+\)"|awk -F'(' '{printf "%d",$2}'`
PORT=`ps -fumqm|grep runmqlsr|grep " $QMGR "|awk '{print $NF}'` java -cp .:$CLASSPATH EmptyQ -s $CCSID -h localhost -c $CHNN -p $PORT -m $QMGR -q $QNME
使用起来很方便:
./clearMQ.sh mq_xxx queue_yyy
MQ队列管理的更多相关文章
- MQ队列管理器搭建(三)
MQ集群及网关队列管理器的搭建 描述: 如上图所示,为MQ的集群搭建部署图.CLUSTERA.CLUSTERB分别是两个集群,其中Qm1-Qm3.GateWayA为CLUSTERA集群中的队列 ...
- MQ队列管理器搭建(二)
MQ级联方式使用场景 使用场景: 如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介.上图中,Application1与Applica ...
- MQ队列管理器搭建(一)
多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Applicat ...
- mq队列管理器命令
dspmq: 队列管理器显示 QMCIPSA-------队列管理器 runmqsc QMSAA 运行查找Q队列名 运行MQ命令 runmqsc QmgrName 如果是默认队列管理器,可以不带其名 ...
- MQ队列及常见操作
一. 创建MQ队列管理器 1.1准备工作 到所安装websphere mq的机子上,进入/opt/mm/bin目录下,查询相关mq的情况,通过命令行./dspmq. 创建mq队列管理器的的时候要用mq ...
- com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器提供的安全性认证无效
com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器“zm_queue_manager”提供的安全性认证无效, ...
- Java调用MQ队列
IBM MQ 6.0中设置两个队列,(远程队列.通道之类都不设置). 队列管理器是XIR_QM_1502 队列名称是ESBREQ IP地址是10.23.117.134(远程的一台电脑,跟我的电脑不在一 ...
- postfix队列管理
队列管理单元的服务器程序--qmgr,是整个postfix系统的中心枢纽.所有邮件,包括等待送出与从外界收进来的,都必须通过队列.了解队列的运行原理以及postfix如何处理队列,有助于你解决问题. ...
- hadoop队列管理(指定queue跑程序)
hadoop 升级到cdh5后,队列管理被取消,而是统一用资源池分配. hadoop2.0版本,Hadoop采用了平级队列组织方式,,管理员可将用户分到若干个扁平队列中,在每个队列中,可指定一个或几个 ...
随机推荐
- HIVE安装配置
Hive简介 Hive 基本介绍 Hive 实现机制 Hive 数据模型 Hive 如何转换成MapReduce Hive 与其他数据库的区别 以上详见:https://chu888chu888.gi ...
- haproxy-代码阅读-内存管理
haproxy内存池概述 内存池按照类型分类,每个类型的内存池都有一个名字,用链表记录空闲的内存块,每个内存块大小相等,并按照16字节对齐. haporxy用pool_head 结构记录内存池 str ...
- 一天搞定CSS---终篇CSS总结
虽然说是一天搞定CSS,实际上也没有那么简单.只能说让你快速了解常见的CSS知识,解决基本的页面样式布局和设置. 每个独立的CSS知识点都比较简单,但是它们的应用非常灵活,特别是在综合应用中. 粗略说 ...
- 并发容器ConcurrentHashMap#put方法解析
jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的Ha ...
- Core ML 机器学习
在WWDC 2017开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API,包括面部识别的视觉 API.自然语言处理 API,这些 API 集成了苹果所谓的 Core ML 框架.Core M ...
- IE低版本兼容的感悟
2017-04-09 曾经折磨一代人的兼容问题,如今也在同样折磨着我们,明明可以做JS判断来避免对ie低版本的兼容,但是却还是耐心的做着兼容,你可能会问这是为什么, 我们调的不是兼容,是整整一代人的情 ...
- Java下一个简单的数据库分库帮助类
简介 前面两篇文章主要讲了数据库读写分离和分表分库的一些问题,这篇文章主要讲一下我个人实现的一个分表分库项目. 在此之前,我有写过一个.Net的分库,最近在做Java的项目,就顺便做出一 ...
- js获取页面宽高
网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...
- SQL Server2012数据库的备份和还原
一.数据库的备份: 1.选择要备份的数据库“accountInfo”,点击鼠标右键 → 任务 → 备份 2.在打开的“备份数据库 —accountInfo”对话框中,先点击删除,然后点击“添加” 3. ...
- [POJ 2115} C Looooops 题解(扩展欧几里德)
题目描述 对于C的for(i=A ; i!=B ;i +=C)循环语句,给出A,B,C和k(k表示变量是在k进制下的无符号整数),判断循环次数,不能终止输出"FOREVER". 输 ...