分享一段代码,很实用。

下面这段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队列管理的更多相关文章

  1. MQ队列管理器搭建(三)

    MQ集群及网关队列管理器的搭建 描述:     如上图所示,为MQ的集群搭建部署图.CLUSTERA.CLUSTERB分别是两个集群,其中Qm1-Qm3.GateWayA为CLUSTERA集群中的队列 ...

  2. MQ队列管理器搭建(二)

    MQ级联方式使用场景 使用场景:     如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介.上图中,Application1与Applica ...

  3. MQ队列管理器搭建(一)

    多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求.   Applicat ...

  4. mq队列管理器命令

    dspmq: 队列管理器显示 QMCIPSA-------队列管理器 runmqsc QMSAA  运行查找Q队列名 运行MQ命令 runmqsc QmgrName 如果是默认队列管理器,可以不带其名 ...

  5. MQ队列及常见操作

    一. 创建MQ队列管理器 1.1准备工作 到所安装websphere mq的机子上,进入/opt/mm/bin目录下,查询相关mq的情况,通过命令行./dspmq. 创建mq队列管理器的的时候要用mq ...

  6. com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器提供的安全性认证无效

    com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器“zm_queue_manager”提供的安全性认证无效, ...

  7. Java调用MQ队列

    IBM MQ 6.0中设置两个队列,(远程队列.通道之类都不设置). 队列管理器是XIR_QM_1502 队列名称是ESBREQ IP地址是10.23.117.134(远程的一台电脑,跟我的电脑不在一 ...

  8. postfix队列管理

    队列管理单元的服务器程序--qmgr,是整个postfix系统的中心枢纽.所有邮件,包括等待送出与从外界收进来的,都必须通过队列.了解队列的运行原理以及postfix如何处理队列,有助于你解决问题.  ...

  9. hadoop队列管理(指定queue跑程序)

    hadoop 升级到cdh5后,队列管理被取消,而是统一用资源池分配. hadoop2.0版本,Hadoop采用了平级队列组织方式,,管理员可将用户分到若干个扁平队列中,在每个队列中,可指定一个或几个 ...

随机推荐

  1. Java Garbage Collectors

    Generational Collectors (分代收集器) GC algos optimised based on two hypotheses / observations: Most obje ...

  2. ionic2 使用 cordova 打包成安卓apk

    准备工作: 1.下载java sdk 配置好java 环境 2.下载android sdk 跟 android studio 并配置好环境 1.查看平台支持,添加android平台 首先命令提示符进入 ...

  3. Nodejs进阶:核心模块Buffer常用API使用总结

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 Buffer是node的核心模块,开发者可以利用它来处 ...

  4. 详细介绍php中的命名空间

    php命名空间的一个最明确的作用是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.上一章节介绍了什么是php命名空间.php官网已很明确的进行了定义并形象化解释,这 ...

  5. Centos7下安装部署MXNET

    Centos下安装MXNET,参考官方文档http://mxnet.io/get_started/setup.html#prerequisites, 一.安装python的mxnet步骤如下: #!/ ...

  6. superagent和request结果转换区别

    superagent和request结果转换区别 使用superagent和request抓取页面内容时,两个抓取内容都可以被cheerio进行处理.但处理时有个细微差别. 1. 使用superage ...

  7. Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...

  8. 设计模式二:MVC

    先附上部分代码: /* *MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. *Model(模型) - 模型代表一个存取数据的对 ...

  9. 每天一个JS 小demo之“随机”抽奖。主要知识点:Math函数,数组方法,递归

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  10. 排序算法 - 插入排序(Insertion sort)

    插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...