zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    套接字I/O模型-WSAAsyncSelect
    套接字I/O模型-完成端口IOCP
    套接字I/O模型-WSAEventSelect(转载)
    Win7+VS2010环境下CEGUI 0.8.4编译过程详解
    数组去重统计排序
    计算当前月有几天
    前端开发仓库
    Jquery中bind(), live(), on(), delegate()四种注册事件的优缺点,建议使用on()
    图表那些事
    图标字体,矢量图标
  • 原文地址:https://www.cnblogs.com/lichmama/p/3835341.html
Copyright © 2011-2022 走看看