簡體   English   中英

IBM MQ使用Java獲取LGETTIME

[英]IBM MQ fetch LGETTIME using Java

我正在嘗試使用Java從IBM Mq那里獲取當前深度,最后一次放置時間和最后一次獲取時間來監視隊列性能。 我能夠使用以下代碼獲取LPUTTIME和當前深度。 我正在使用MQMESSAGE瀏覽API。 但是我很難獲取LGETTIME(最后一條消息獲取時間)-超出隊列處理的最后一條消息。 因為MQMESSAGE瀏覽沒有像上一次獲取時間那樣的東西。 關於此有任何幫助嗎?

public int depthOf(String queueName) throws MQException {
    MQQueue queue = qmgr.accessQueue(queueName, mqOpnOpt, null, null, null);
    int qDpth = queue.getCurrentDepth();

    queue.close();
    //qmgr.disconnect();
    System.out.println("Current Depth of "+ queueName + " is " + qDpth);                
    return qDpth;
}

@SuppressWarnings("unchecked")
private MQQueueManager createQueueManager() throws MQException {
    MQEnvironment.channel = channel;
    MQEnvironment.port = port;
    MQEnvironment.hostname = host;
    MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY,
            CMQC.TRANSPORT_MQSERIES);

    return new MQQueueManager(manager);
}

/**
 * Returns 1st message put time when it is put in to Queue and not consumed.
 * 
 * @return
 * @throws MQException
 */
public int queueMsgAge() throws MQException {
    MQQueue queue = null;
    MQMessage message = new MQMessage();
    queue = qmgr.accessQueue(queueName, MQC.MQOO_BROWSE
            | MQC.MQOO_FAIL_IF_QUIESCING);
    MQGetMessageOptions gmo = new MQGetMessageOptions();
    gmo.options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_NO_WAIT;
    queue.get(message, gmo);

    GregorianCalendar cal = message.putDateTime;
    long ageInMillis = new java.util.Date().getTime()
            - cal.getTime().getTime();
    int ageInSeconds = (int) ageInMillis / 1000;
    System.out.println("Put Date & Time: "+ cal.getTime()
            + " Age of Msg in seconds: " + ageInSeconds + " Queue Name "
            + queueName);
    _log.info("Put Date & Time: " + cal.getTime() + " Age of Msg in seconds: "
            + ageInSeconds + " Queue Name " + queueName);
    return ageInSeconds;
}

首先閱讀上面的JoshMc&Morag的評論。

其次,您應該使用runmqsc發出兩種“隊列狀態”命令。 即處理與隊列。 注意:您對與隊列狀態類型(QUEUE)相關的值感興趣。

即runmqsc命令:

DIS QSTATUS(TEST.Q1) TYPE(QUEUE)

第三,不要使用MQEnvironment類,因為它不是線程安全的。 將連接信息放入Hashtable中,並將Hashtable傳遞給MQQueueManager類。

如以上注釋中所述,您無法通過常規MQ程序檢索該信息。 您需要編寫一個MQ Java程序,該程序向隊列管理器的命令服務器發出PCF命令。

創建PCF請求消息時,必須按特定順序添加參數。 這有點痛苦,但您只是習慣了。

這是一個簡單的MQ Java程序,它將發出PCF“查詢隊列狀態”命令,獲取PCF響應消息,遍歷PCF響應並輸出信息。

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import com.ibm.mq.MQException;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.constants.CMQCFC;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.pcf.PCFMessage;
import com.ibm.mq.headers.pcf.PCFMessageAgent;

/**
 * Program Name
 *  MQListQueueStatus01
 *
 * Description
 *  This java class issues a PCF "inquire queue status" request message for all ("*") queues 
 *  of a remote queue manager. 
 *
 * Sample Command Line Parameters
 *  -m MQA1 -h 127.0.0.1 -p 1414 -c TEST.CHL -q TEST.Q1 -u UserID -x Password
 *
 * @author Roger Lacroix
 */
public class MQListQueueStatus01
{
   private static final SimpleDateFormat  lOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

   private Hashtable<String,String> params;
   private Hashtable<String,Object> mqht;
   private String qMgrName;

   public MQListQueueStatus01()
   {
      super();
      params = new Hashtable<String,String>();
      mqht = new Hashtable<String,Object>();
   }

   /**
    * Make sure the required parameters are present.
    * @return true/false
    */
   private boolean allParamsPresent()
   {
      boolean b = params.containsKey("-h") && params.containsKey("-p") &&
                  params.containsKey("-c") && params.containsKey("-m") &&
                  params.containsKey("-u") && params.containsKey("-x");
      if (b)
      {
         try
         {
            Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            b = false;
         }
      }

      return b;
   }

   /**
    * Extract the command-line parameters and initialize the MQ HashTable.
    * @param args
    * @throws IllegalArgumentException
    */
   private void init(String[] args) throws IllegalArgumentException
   {
      int port = 1414;
      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())
      {
         qMgrName = (String) params.get("-m");

         try
         {
            port = Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            port = 1414;
         }

         mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
         mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
         mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
         mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
         mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));

         // I don't want to see MQ exceptions at the console.
         MQException.log = null;
      }
      else
      {
         throw new IllegalArgumentException();
      }
   }

   private void doPCF()
   {
      MQQueueManager qMgr = null;
      PCFMessageAgent agent = null;
      PCFMessage   request = null;
      PCFMessage[] responses = null;

      try
      {
         qMgr = new MQQueueManager(qMgrName, mqht);
         MQListQueueStatus01.logger("successfully connected to "+ qMgrName);

         agent = new PCFMessageAgent(qMgr);
         MQListQueueStatus01.logger("successfully created agent");

         // https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.adm.doc/q087880_.htm
         request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_STATUS);

         /**
          * You can explicitly set a queue name like "TEST.Q1" or
          * use a wild card like "TEST.*"
          */
         request.addParameter (CMQC.MQCA_Q_NAME, "*");
         request.addParameter(CMQCFC.MQIACF_Q_STATUS_TYPE, CMQCFC.MQIACF_Q_STATUS);

         request.addParameter(CMQCFC.MQIACF_Q_STATUS_ATTRS,
               new int [] { CMQC.MQCA_Q_NAME,
                            CMQC.MQIA_CURRENT_Q_DEPTH,
                            CMQC.MQIA_OPEN_INPUT_COUNT,
                            CMQC.MQIA_OPEN_OUTPUT_COUNT,
                            CMQCFC.MQCACF_LAST_PUT_DATE,
                            CMQCFC.MQCACF_LAST_PUT_TIME,
                            CMQCFC.MQCACF_LAST_GET_DATE,
                            CMQCFC.MQCACF_LAST_GET_TIME,
                          });

         responses = agent.send(request);

         for (int i = 0; i < responses.length; i++)
         {
            if ((responses[i]).getCompCode() == CMQC.MQCC_OK)
            {
               String name = responses[i].getStringParameterValue(CMQC.MQCA_Q_NAME);

               int depth = responses[i].getIntParameterValue(CMQC.MQIA_CURRENT_Q_DEPTH);
               int iprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_INPUT_COUNT);
               int oprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_OUTPUT_COUNT);

               String lastPutDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_DATE);
               String lastPutTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_TIME);

               String lastGetDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_DATE);
               String lastGetTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_TIME);

               MQListQueueStatus01.logger("Name="+name.trim()+" : depth="+depth + " : iprocs="+iprocs+" : oprocs="+oprocs+" : lastPutDate='"+lastPutDate.trim()+"' : lastPutTime='"+lastPutTime.trim()+"' : lastGetDate='"+lastGetDate.trim()+"' : lastGetTime='"+lastGetTime.trim()+"'");
            }
         }
      }
      catch (MQException e)
      {
         MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
      catch (IOException e)
      {
         MQListQueueStatus01.logger("IOException:" +e.getLocalizedMessage());
      }
      catch (MQDataException e)
      {
         MQListQueueStatus01.logger("MQDataException:" +e.getLocalizedMessage());
      }
      finally
      {
         try
         {
            if (agent != null)
            {
               agent.disconnect();
               MQListQueueStatus01.logger("disconnected from agent");
            }
         }
         catch (MQDataException e)
         {
            MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }

         try
         {
            if (qMgr != null)
            {
               qMgr.disconnect();
               MQListQueueStatus01.logger("disconnected from "+ qMgrName);
            }
         }
         catch (MQException e)
         {
            MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
      }
   }

   /**
    * A simple logger method
    * @param data
    */
   public static void logger(String data)
   {
      String className = Thread.currentThread().getStackTrace()[2].getClassName();

      // Remove the package info.
      if ( (className != null) && (className.lastIndexOf('.') != -1) )
         className = className.substring(className.lastIndexOf('.')+1);

      System.out.println(lOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
   }

   public static void main(String[] args)
   {
      MQListQueueStatus01 mqlqs = new MQListQueueStatus01();

      try
      {
         mqlqs.init(args);
         mqlqs.doPCF();
      }
      catch (IllegalArgumentException e)
      {
         MQListQueueStatus01.logger("Usage: java MQListQueueStatus01 -m QueueManagerName -h host -p port -c channel -u UserID -x Password");
         System.exit(1);
      }

      System.exit(0);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM