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:   nextgodhand@163.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 

posted @ 2014-07-10 11:24  lichmama  阅读(3486)  评论(0编辑  收藏  举报