MQ队列管理

分享一段代码,很实用。

下面这段java代码是我在国外一个论坛上发现的,源地址已经忘了。代码的作用是可以删除正在使用的mq的队列消息,管理mq的人一定知道它的美妙了吧,哈哈。

我拿来改了下,增加了2个参数支持:ccsid和channel。上代码:

  1 import java.util.Hashtable;
  2 import com.ibm.mq.*;
  3
  4 /**
  5  * A simply Java class to destructively read (delete) all message on a queue.
  6  *
  7  * @author Roger Lacroix, Capitalware Inc.
  8  * @return 0 for ok or 1 for failed.
  9  * @version 1.0.0
 10  * @license Apache 2 License
 11  */
 12
 13 /**
 14  * lichmama reedited
 15  * change: add parameters to set ccsid and channel
 16  */
 17
 18 public class EmptyQ
 19 {
 20    private Hashtable params = null;
 21    public int port = 1414;
 22    public String hostname;
 23    public String channel;
 24    public String qManager;
 25    public String inputQName;
 26    public int ccsid = 1208;
 27
 28    /**
 29     * The constructor
 30     */
 31    public EmptyQ()
 32    {
 33       super();
 34    }
 35
 36    /**
 37     * Check if all of the parameters were passed to the class file.
 38     * @return true/false
 39     */
 40    private boolean allParamsPresent()
 41    {
 42       boolean b =  params.containsKey("-s") && params.containsKey("-h") && params.containsKey("-p") && params.containsKey("-c") && params.containsKey("-m") && params.containsKey("-q");
 43       if (b)
 44       {
 45          try
 46          {
 47             port = Integer.parseInt((String) params.get("-p"));
 48             ccsid = Integer.parseInt((String) params.get("-s"));
 49          }
 50          catch (NumberFormatException e)
 51          {
 52             b = false;
 53          }
 54          // Set up MQ environment
 55          hostname = (String) params.get("-h");
 56          channel = (String) params.get("-c");
 57          qManager = (String) params.get("-m");
 58          inputQName = (String) params.get("-q");
 59
 60       }
 61       return b;
 62    }
 63
 64    /**
 65     * Initialize MQ environment variables
 66     * @param args
 67     * @throws IllegalArgumentException
 68     */
 69    private void init(String[] args) throws IllegalArgumentException
 70    {
 71       params = new Hashtable(5);
 72       if (args.length > 0 && (args.length % 2) == 0)
 73       {
 74          for (int i = 0; i < args.length; i += 2)
 75             params.put(args[i], args[i + 1]);
 76       }
 77       else
 78       {
 79          throw new IllegalArgumentException();
 80       }
 81       if (allParamsPresent())
 82       {
 83          // Set up MQ environment
 84          MQEnvironment.hostname = hostname;
 85          MQEnvironment.channel = channel;
 86          MQEnvironment.port = port;
 87          //CCSID: DIS QMGR CCSID
 88          MQEnvironment.CCSID = ccsid;
 89          MQException.log = null; /* Tell MQ client library not to output anything. */
 90       }
 91       else
 92       {
 93          throw new IllegalArgumentException();
 94       }
 95    }
 96
 97    /**
 98     * Main entry point.
 99     * @param args
100     */
101    public static void main(String[] args)
102    {
103
104       EmptyQ readQ = new EmptyQ();
105
106       try
107       {
108          readQ.init(args);
109          readQ.emptyIt();
110       }
111       catch (IllegalArgumentException e)
112       {
113          System.err.println("Usage: java EmptyQ <-s ccsid> <-h host> <-p port> <-c channel> <-m QueueManagerName> <-q QueueName>");
114          System.exit(1);
115       }
116    }
117
118    /**
119     * Connect to a queue manager, open a queue then destructively get (delete)
120     * all messages on the queue.
121     */
122    private void emptyIt()
123    {
124       boolean loopAgain = true;
125       MQQueueManager _queueManager = null;
126       MQQueue queue = null;
127       int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED;
128       System.out.println("EmptyQ v1.0.0 by Capitalware Inc.");
129       try
130       {
131          _queueManager = new MQQueueManager(qManager);
132          System.out.println("EmptyQ: Connected to queue manager "+qManager);
133
134          try
135          {
136             queue = _queueManager.accessQueue(inputQName, openOptions, null, null, null);
137             System.out.println("EmptyQ: Opened queue "+inputQName);
138
139             int depth = queue.getCurrentDepth();
140             System.out.println("EmptyQ: Current depth: " + depth);
141
142             MQGetMessageOptions getOptions = new MQGetMessageOptions();
143             getOptions.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING + MQC.MQGMO_ACCEPT_TRUNCATED_MSG;
144
145             MQMessage message;
146             while (loopAgain)
147             {
148                message = new MQMessage();
149                try
150                {
151                   queue.get(message, getOptions, 1);
152                }
153                catch (MQException e)
154                {
155                   if (e.completionCode == 1 && e.reasonCode == MQException.MQRC_TRUNCATED_MSG_ACCEPTED)
156                   {
157                       // Just what we expected!!
158                   }
159                   else
160                   {
161                      loopAgain = false;
162                      if (e.completionCode == 2 && e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE)
163                      {
164                         // Good, we are now done - no error!!
165                      }
166                      else
167                      {
168                         System.err.println("EmptyQ: MQException: " + e.getLocalizedMessage());
169                      }
170                   }
171                }
172             }
173             System.out.println("EmptyQ: Queue emptied.");
174          }
175          catch (MQException e1)
176          {
177             System.err.println("EmptyQ: MQException: " + e1.getLocalizedMessage());
178          }
179          finally
180          {
181             if (queue != null)
182             {
183                queue.close();
184                System.out.println("EmptyQ: Closed queue "+inputQName);
185             }
186
187             if (_queueManager != null)
188             {
189                _queueManager.disconnect();
190                System.out.println("EmptyQ: Disconnect from "+qManager);
191             }
192          }
193       }
194       catch (MQException e1)
195       {
196          System.err.println("EmptyQ: MQException: " + e1.getLocalizedMessage());
197       }
198    }
199 }

下面,再贴一个我用shell写的壳:

 1 #!/bin/bash
 2 #       File:   clearMQ.sh
 3 #       Whatfor:empty the queue‘s curdepth WHEN IT OVERSTOCKS,
 4 #               and all the performance depends on EmptyQ.class,
 5 #               which [@author Roger Lacroix, Capitalware Inc.] made it.thx this guy:)
 6 #       Auth:   [email protected]sw.com
 7 #       Usage:  ./clearMQ.sh <QueueManagerName> <QueueName> [CHANNEL_NAME]
 8 #
 9
10 #set user env.
11 #. ~/.bash_profile
12
13 if [ $# -lt 2 ]; then
14         echo "Usage: $0 <QueueManagerName> <QueueName> [CHANNEL_NAME]"
15         exit 1
16 fi
17
18 QMGR=$1
19 QNME=$2
20 CHNN=$3
21
22 if [ -z "`dspmq|grep "$QMGR"`" ]; then
23         echo "Error: $QMGR not running."
24         exit 2
25 fi
26
27 if [ -z "`echo "DIS QUEUE(*)"|runmqsc $QMGR|grep "($QNME)"`" ]; then
28         echo "Error: $QNME not exists in $QMGR."
29         exit 3
30 fi
31
32 if [ -z "$CHNN" ]; then
33         CHNN="SYSTEM.ADMIN.SVRCONN"
34 fi
35
36 CCSID=`echo "DIS QMGR CCSID"|runmqsc $QMGR|grep -oE "CCSID\([0-9]+\)"|awk -F‘(‘ ‘{printf "%d",$2}‘`
37 PORT=`ps -fumqm|grep runmqlsr|grep " $QMGR "|awk ‘{print $NF}‘`
38
39 java -cp .:$CLASSPATH EmptyQ -s $CCSID -h localhost -c $CHNN -p $PORT -m $QMGR -q $QNME

使用起来很方便:

1 ./clearMQ.sh mq_xxx queue_yyy

MQ队列管理

时间: 2024-11-05 19:04:23

MQ队列管理的相关文章

MQ队列管理器搭建(一)

多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Application1需要连接MQ,并将消息放入队列Queue中,Application2同样连接MQ,监听在Queue队列上,一旦发现有消息进入则取出该消息进行处理. 下面将给出创建队列管理器和队列的示例: 定义队列管理器名称为Qm1,本地队列名称为Queue,服务器连接通道CHAN_SERVER_CON,监听端口

MQ队列管理器搭建(三)

MQ集群及网关队列管理器的搭建 描述: 如上图所示,为MQ的集群搭建部署图.CLUSTERA.CLUSTERB分别是两个集群,其中Qm1-Qm3.GateWayA为CLUSTERA集群中的队列管理器:Qm1-Qm3.GateWayB是CLUSTERB集群中的队列管理器.GateWayA与GateWayB负责网络路由和消息分发,使用集群的方式可以达到负载均衡的目的,除此之外还能提高MQ使用的稳定性.同一个集群中除网关队列管理器外的任意队列管理器因故关闭或停止工作后,其他的队列管理器可以接管它的工作

MQ队列管理器搭建(二)

MQ级联方式使用场景 使用场景: 如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介.上图中,Application1与Application2通信不进行直接连接,而是通过与MQ通信从而实现二者的通信.图中两个MQ的信息如上描述.其中RemoteQueue为远程队列,该队列指定了目标端对应的队列为Queue,并且该远程队列指定了传输所使用的传输队列尾TransQueue:而此传输队列TransQueue与发送通道CHAN_QMGR1_TO

JMSWMQ0018: 连接至队列管理器 &#39;QMGR&#39; 失败,连接方式为 &#39;Bindings&#39;

之前写的一个用JMS监听MQ的java程序,调用本地MQ一起正常.可是今天突然去调用远程服务器上的队列时却报错了. 以下是报错信息 Exception in thread "main" org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is com.ibm.msg.client.jms.Det

Java调用MQ队列

IBM MQ 6.0中设置两个队列,(远程队列.通道之类都不设置). 队列管理器是XIR_QM_1502 队列名称是ESBREQ IP地址是10.23.117.134(远程的一台电脑,跟我的电脑不在一个局域网内) 端口1414 CCSID 1208 MQ配置可以参考这个,有配图http://wenku.baidu.com/view/06d108d0360cba1aa811daa3.html 程序如下,发送线程两个,接收线程一个.接收完毕后就结束. [java] view plaincopy /*

Postfix常用命令和邮件队列管理(queue)

本文主要介绍一下postfix的常用命令及邮件队列的管理: Postfix有以下四种邮件队列,均由管理队列的进程统一进行管理: maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中. incoming:放置正在到达队列或管理进程尚未发现的邮件. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有长度的限制. deferred:放置不能被投递的邮件.可能是推迟发送的邮件 启动postfix /usr/sbin/postfix start 停止pos

postfix 队列管理

队列管理中真正的main函数式 trigger_server_main(argc, argv, qmgr_trigger_event, CA_MAIL_SERVER_INT_TABLE(int_table), CA_MAIL_SERVER_STR_TABLE(str_table), CA_MAIL_SERVER_BOOL_TABLE(bool_table), CA_MAIL_SERVER_TIME_TABLE(time_table), CA_MAIL_SERVER_PRE_INIT(qmgr_p

Python查看MQ队列深度

分享一段代码,很简单但是也很实用. 1 #!/usr/bin/python 2 #-*- coding:gb18030 -*- 3 ''' 4 Usage: mq.py [Qmgr] 5 *get the queues' curdepth which type is local, 6 and sorted by curdepth desc. 7 Auth : [email protected] 8 ''' 9 10 import re 11 import os 12 import sys 13

Unity 动画(UITweener)、协程(Coroutine)和委托(Delegate)队列管理

问题         前段时间,项目中要做奖励界面UI缓动动画要一个接着一个播放,如:先播放达成星星动画,在播放经验数字增加动画,最后播放奖励物品动画. 当然最笨最直接的方法可以类似成语接龙那样,把下个动画的开始播放都写在上一个动画播放完毕委托中.一般直接的方法是实现起来非常之简单,但这里却不是,会看见代码中有一系列播放完毕回调函数(除了最后一个),显然维护起来是否费劲. 把上面的方法进行简化,把回调函数变为一个:维护一个动画的 List 和当前播放动画的索引 index ,然后再回调函数中只需