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采用了平级队列组织方式,,管理员可将用户分到若干个扁平队列中,在每个队列中,可指定一个或几个 ...
随机推荐
- scauoj 18025 小明的密码 数位DP
18025 小明的密码 时间限制:4000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description 小明的密码由N(1<=N& ...
- Bootstrap快速入门
Bootstrap有两个重点,一个是概念的理解,理解bootstrap是如何通过div来代替过去的table布局的:一个是常用结构的熟悉,做到需要的组件马上就能找到,小修修改改可用就行.其最帅的一点就 ...
- ios runtime 打印内 内部调用的属性
unsigned int count = 0; // 拷贝出所有的成员变量列表 Ivar *ivars = class_copyIvarList([UITextField class], &c ...
- C语言之循环结构
程序结构: 顺序结构 条件结构(分支结构) if结构,if-else结构 ,多重if分支结构,switch结构 循环结构:做重复的事情 while循环,do..while循环和for循环. 写循环结构 ...
- javascript基础-事件1
原理 事件分两种.第一种浏览器事件,由浏览器抛出事件,它是人机交互的基础:第二种自定义事件,由程序员抛出事件,它是模拟事件流程.两者都是为了完成数据的传递. 浏览器事件 机制 冒泡和捕获两种机制.因I ...
- Python抓取成都房价信息
Python里scrapy爬虫 scrapy爬虫,正好最近成都房价涨的厉害,于是想着去网上抓抓成都最近的房价情况,顺便了解一下,毕竟咱是成都人,得看看这成都的房子我以后买的起不~ 话不多说,进入正题: ...
- FTP主动模式和被动模式的区别
基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常21端口是命令端口,20端口是数据端口.当 ...
- phpcms插件
最近在研究PHP,学了一段时间后感觉想自己写点东西,但是又不知道写什么,最后把目标对准了PHPCMS的插件,从网上找了一下,大部分教程都只是教怎么写插件的具体代码,而没有教怎么把插件打成安装包,特别是 ...
- MyBB 18 SQL Injection Vulnerability
<?php error_reporting(0); ?> <form method="post" action=""> Input a ...
- jdbc的配置及jdbc连接常用数据库(mysql、sqlserver、Oracle)
1.连接SQL Server数据库 import java.sql.*; publicclassMain{publicstaticvoid main(String[] args){String dri ...