Author |
Message
|
d |
Posted: Sun Jun 02, 2002 10:41 pm Post subject: Inquiring Channel status |
|
|
Apprentice
Joined: 24 May 2002 Posts: 25
|
Hi,
I'm trying to inquire channel status by using the import com.ibm.mq.pcf jar file. I have downloaded the ms0b.zip and was trying to modify one of the sample examples to suit my need (since there weren't any ex on how to obtain channel status)....
But I'm not very sure of what all attributes to set....
I'm getting the following error result :
Connecting to local queue manager QM_sr229_11442... Connected.
Sending PCF request... Received reply.
PCF error:
com.ibm.mq.pcf.MQCFH:
- type: 2
- strucLength: 36
- version: 1
- command: 42
- msgSeqNumber: 1
- control: 0
- compCode: 2
- reason: 3013
- parameterCount: 1
com.ibm.mq.pcf.MQCFIN:
- type: 3
- strucLength: 16
- parameter: 1012
- value: 1527
Disconnecting... Done.
-----------------------------------------------------------------------------
My code is
import java.io.*;
import com.ibm.mq.*;
import com.ibm.mq.pcf.*;
/**
* PCF example class showing use of PCFAgent and com.ibm.mq.pcf structure types
* to generate and parse a PCF query.
*
*
*/
public class ListChannelAttr
{
final public static String copyright = "Copyright (c) IBM Corp. 1998, 2000 All rights
reserved.";
public static void main (String [] args)
{
int [] attrs = { CMQC.MQOT_SENDER_CHANNEL };
PCFAgent agent;
PCFParameter [] parameters = { new MQCFIL (CMQCFC.MQIACH_CHANNEL_STATUS,
attrs) };
MQMessage [] responses;
MQCFH cfh;
PCFParameter p;
try
{
// Connect a PCFAgent to the specified queue manager
if (args.length == 1)
{
System.out.print ("Connecting to local queue manager " +
args [0] + "... ");
agent = new PCFAgent (args [0]);
}
else
{
System.out.print ("Connecting to queue manager at " +
args [0] + ":" + args [1] + " over channel " + args [2] +
"... ");
agent = new PCFAgent (args [0], Integer.parseInt (args [1]), args
[2]);
}
System.out.println ("Connected.");
// Use the agent to send the request
System.out.print ("Sending PCF request... ");
responses = agent.send (CMQCFC.MQCMD_INQUIRE_CHANNEL_STATUS, parameters);
System.out.println ("Received reply.");
cfh = new MQCFH (responses [0]);
// Check the PCF header (MQCFH) in the first response message
if (cfh.reason == 0)
{
System.out.println ("Queue manager attributes:");
for (int i = 0; i < cfh.parameterCount; i++)
{
// Walk through the returned attributes
p = PCFParameter.nextParameter (responses [0]);
System.out.println ("\t attribute id " +
p.getParameter () + "=" + p.getValue ());
}
}
else
{
System.out.println ("PCF error:\n" + cfh);
// Walk through the returned parameters describing the error
for (int i = 0; i < cfh.parameterCount; i++)
{
System.out.println (PCFParameter.nextParameter (responses
[0]));
}
}
// Disconnect
System.out.print ("Disconnecting... ");
agent.disconnect ();
System.out.println ("Done.");
}
catch (ArrayIndexOutOfBoundsException abe)
{
System.out.println ("Usage: \n" +
"\tjava ListQManagerAttrs queue-manager\n" +
"\tjava ListQManagerAttrs host port channel");
}
catch (NumberFormatException nfe)
{
System.out.println ("Invalid port: " + args [1]);
System.out.println ("Usage: \n" +
"\tjava ListQManagerAttrs queue-manager\n" +
"\tjava ListQManagerAttrs host port channel");
}
catch (MQException mqe)
{
System.err.println (mqe);
}
catch (IOException ioe)
{
System.err.println (ioe);
}
}
}
---------------------------------------------------------------------------
Highlighted are the portions where I am not sure of the options....
If anybody knows what parameters are to be set, please update me.
Thanks in advance,
d |
|
Back to top |
|
 |
RogerLacroix |
Posted: Tue Jun 04, 2002 8:37 pm Post subject: |
|
|
 Jedi Knight
Joined: 15 May 2001 Posts: 3264 Location: London, ON Canada
|
Hi,
You appear to have your "attrs" incorrectly set.
Here's a Java program that has been floating around the MQ ListServer that inquires on a channel(s) status and a queue.
ftp://24.102.134.9/pub/code/java/ListChannelStatus.zip
Sorry, I don't remember who the author is.
later
Roger... |
|
Back to top |
|
 |
RogerLacroix |
Posted: Mon Sep 13, 2004 8:02 am Post subject: |
|
|
 Jedi Knight
Joined: 15 May 2001 Posts: 3264 Location: London, ON Canada
|
Here's a copy of the code that I have since that link is dead.
Code: |
import java.io.*;
import java.util.*;
import com.ibm.mq.*;
import com.ibm.mq.pcf.*;
public class ListChannelStatus
{
private Properties properties = new Properties(); // Contains system settings.
//***********
//** main()
//***********
static public void main(String args[])
{
ListChannelStatus lcs = new ListChannelStatus();
try
{
lcs.init();
lcs.channelStatus(lcs.properties);
lcs.queueDepth(lcs.properties);
}
catch (Exception e)
{
System.out.println("general exception NOT handled in main");
e.printStackTrace();
}
}
//***********
//** method init()
//***********
public void init() throws Exception
{
// Load system properties from file "properties.ini"
FileInputStream fis = new FileInputStream("ListChannelStatus.properties");
properties.load(fis);
fis.close();
// List system properties
ByteArrayOutputStream baos = new ByteArrayOutputStream();
properties.list(new PrintWriter(baos, true));
System.out.println(baos.toString());
// turn off the mqji messages, since we're handling some of them
MQException.log = null;
}
//***********
//** method void channelStatus(Properties p)
// This method accepts a Properties Oject which contains the details about the
// channel whose status is to be monitored
// Monitor_IP - the IP or DNS name for the Server which hosts the channel
// Monitor_Port - the listening port for the MQSeries Qmgr
// Monitor_Channel - svrconn channel used to connect to qmgr being monitored
// (this is not necessarily the channel being monitored)
// Target_Channel_Name - the channel being monitored
//
//***********
public void channelStatus(Properties p) throws Exception
{
// Set the situation variables
String monitorIP = new String(p.getProperty("Monitor_IP"));
int monitorPort = Integer.parseInt(p.getProperty("Monitor_Port"));
String monitorChannel = new String(p.getProperty("Monitor_Channel"));
String targetName = new String(p.getProperty("Target_Channel_Name"));
int chlCount = 0;
// set up the PCF agent
PCFMessageAgent agent;
PCFMessage request;
PCFMessage[] responses;
// build a request
request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_CHANNEL_STATUS);
// add a parameter designating the name of the channel for which status is requested
request.addParameter(CMQCFC.MQCACH_CHANNEL_NAME, targetName);
// add a parameter designating the instance type (current) desired
request.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_TYPE, CMQC.MQOT_CURRENT_CHANNEL);
// add a parameter designating the attributes desired, but first...
// ...build an array list of attributes desired
int[] attrs = {CMQCFC.MQCACH_CHANNEL_NAME,
CMQCFC.MQCACH_CONNECTION_NAME,
CMQCFC.MQIACH_MSGS,
CMQCFC.MQCACH_LAST_MSG_DATE,
CMQCFC.MQCACH_LAST_MSG_TIME,
CMQCFC.MQIACH_CHANNEL_STATUS};
// ...now add the parameter for these attributes
request.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_ATTRS, attrs);
try
{
// connect to the queue manager using the PCFMessageAgent
agent = new PCFMessageAgent();
agent.connect(monitorIP, monitorPort, monitorChannel);
}
catch (Exception e)
{
throw e;
}
try
{
// send the request and collect the responses
responses = agent.send(request);
for (int i = 0; i < responses.length; i++)
{
// get the channel name and trim the spaces
String temp = responses[i].getStringParameterValue(CMQCFC.MQCACH_CHANNEL_NAME);
String channelName = temp.trim();
// get the channel name and trim the spaces
temp = responses[i].getStringParameterValue(CMQCFC.MQCACH_CONNECTION_NAME);
String connectionName = temp.trim();
// get the channel last message date/time
temp = responses[i].getStringParameterValue(CMQCFC.MQCACH_LAST_MSG_DATE);
String lstMsgDate = temp.trim();
temp = responses[i].getStringParameterValue(CMQCFC.MQCACH_LAST_MSG_TIME);
String lstMsgTime = temp.trim();
// get the channel current messages total
int totalMsgs = responses[i].getIntParameterValue(CMQCFC.MQIACH_MSGS);
// get the channel status
int chlStatus = responses[i].getIntParameterValue(CMQCFC.MQIACH_CHANNEL_STATUS);
if (chlStatus != CMQCFC.MQCHS_INACTIVE)
{
//System.out.println(" chlStatus = " + chlStatus);
chlCount++;
}
System.out.println("chl: " + channelName + " IP: " + connectionName + " msgs: " + totalMsgs +
" last msg time: " + lstMsgDate + " " + lstMsgTime + " status: " + chlStatus);
}
System.out.println(targetName + " count=" + chlCount);
}
catch (PCFException pcfEx)
{
switch (pcfEx.reasonCode)
{
case CMQCFC.MQRCCF_CHL_STATUS_NOT_FOUND :
{
System.out.println(targetName + " count=" + chlCount);
break;
}
default :
System.out.println("PCF Exception NOT!! handled in ChannelStatus");
throw pcfEx;
}
}
finally
{
agent.disconnect();
}
}
//***********
//** method void queueDepth(Properties p)
// This method accepts a Properties Oject which contains the details about the
// queue whose depth is to be monitored and returns true if an alert is to be sent
// Monitor_IP - the IP or DNS name for the Server which hosts the channel
// Monitor_Port - the listening port for the MQSeries Qmgr
// Monitor_Channel - svrconn channel used to connect to qmgr being monitored
// (this is not necessarily the channel being monitored)
// Target_Queue_Name - the queue being monitored
//
//***********
public void queueDepth(Properties p) throws Exception
{
// Set the situation variables
String monitorIP = new String(p.getProperty("Monitor_IP"));
int monitorPort = Integer.parseInt(p.getProperty("Monitor_Port"));
String monitorChannel = new String(p.getProperty("Monitor_Channel"));
String targetName = new String(p.getProperty("Target_Queue_Name"));
int qDepth = 0;
// set up the PCF agent
PCFMessageAgent agent;
PCFMessage request;
PCFMessage[] responses;
// build a request
request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q);
// add a parameter designating the name of the channel for which status is requested
request.addParameter(CMQC.MQCA_Q_NAME, targetName);
try
{
// connect to the queue manager using the PCFMessageAgent
agent = new PCFMessageAgent();
agent.connect(monitorIP, monitorPort, monitorChannel);
}
catch (Exception e)
{
throw e;
}
try
{
// send the request and collect the responses
responses = agent.send(request);
for (int i = 0; i < responses.length; i++)
{
// get the queue depth
qDepth = responses[i].getIntParameterValue(CMQC.MQIA_CURRENT_Q_DEPTH);
System.out.println("queue depth of " + targetName + " = " + qDepth);
}
}
catch (PCFException pcfEx)
{
System.out.println("PCF Exception NOT!! handled in ChannelStatus");
throw pcfEx;
}
finally
{
agent.disconnect();
}
}
} |
And here is what the listchannelstatus.properties file looks like:
Code: |
Monitor_IP=127.0.0.1
Monitor_Port=1430
Monitor_Channel=CLIENT.TO.MQA1
Target_Channel_Name=*
Target_Queue_Name=INPUT.TEST.QUEUE |
Hope that helps.
Regards,
Roger Lacroix _________________ Capitalware: Transforming tomorrow into today.
Connected to MQ!
Twitter |
|
Back to top |
|
 |
fireguok |
Posted: Sun Mar 15, 2009 12:01 am Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
I only retrieved the status of monitor channel not all the channels by the code above.
Can anyone explain? |
|
Back to top |
|
 |
fjb_saper |
Posted: Sun Mar 15, 2009 1:03 am Post subject: |
|
|
 Grand High Poobah
Joined: 18 Nov 2003 Posts: 20756 Location: LI,NY
|
fireguok wrote: |
I only retrieved the status of monitor channel not all the channels by the code above.
Can anyone explain? |
Could it be that you don't have permission to display any other channel than yours?  _________________ MQ & Broker admin |
|
Back to top |
|
 |
fireguok |
Posted: Sun Mar 15, 2009 5:18 am Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
I used the default channel below as the monitored channel. The mcauser is MUSR_MQADMIN.
SYSTEM.DEF.SVRCONN |
|
Back to top |
|
 |
mqjeff |
Posted: Sun Mar 15, 2009 9:25 am Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
fireguok wrote: |
I used the default channel below as the monitored channel. The mcauser is MUSR_MQADMIN.
SYSTEM.DEF.SVRCONN |
This means that your queue manager is entirely unsecure and everyone on the entire planet who can establish a network connection to your queue manager's listener port can do anything they want to that queue manager, and the machine that it is running on.
You may want to consider changing that.
Have you compared the results of "your" code with the results of DIS CHSTATUS? Are they different, or the same? |
|
Back to top |
|
 |
fireguok |
Posted: Sun Mar 15, 2009 3:45 pm Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
Yes. This is only for the test.
Ideally i need to list all the status of the channel. If I issue dis chstatus, it won't list the channel which has inactive, stopped status. |
|
Back to top |
|
 |
gbaddeley |
Posted: Sun Mar 15, 2009 4:37 pm Post subject: |
|
|
 Jedi Knight
Joined: 25 Mar 2003 Posts: 2538 Location: Melbourne, Australia
|
fireguok wrote: |
Yes. This is only for the test.
Ideally i need to list all the status of the channel. If I issue dis chstatus, it won't list the channel which has inactive, stopped status. |
DIS CHS( ) should display channels that are STATUS(STOPPED). It does for me.
It won't display inactive channels because inactive means there are no active instances in the qmgr and hence no "current" status. There can however be "saved" status info for inactive channels. _________________ Glenn |
|
Back to top |
|
 |
fireguok |
Posted: Sun Mar 15, 2009 9:59 pm Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
Thanks for your information. Have you tried PCF to list all the channel status including inactive? |
|
Back to top |
|
 |
fjb_saper |
Posted: Sun Mar 15, 2009 10:21 pm Post subject: |
|
|
 Grand High Poobah
Joined: 18 Nov 2003 Posts: 20756 Location: LI,NY
|
fireguok wrote: |
Thanks for your information. Have you tried PCF to list all the channel status including inactive? |
The point here was that an inactive channel has no status and therefore can only be listed by comparing the channel status list to the channel list.
Have fun  _________________ MQ & Broker admin |
|
Back to top |
|
 |
fireguok |
Posted: Sun Mar 15, 2009 10:34 pm Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
I'm not sure if I understand you.
My objective is to list status of all the channel no matther what the status is.
Can I use PCF here? |
|
Back to top |
|
 |
Mr Butcher |
Posted: Sun Mar 15, 2009 11:19 pm Post subject: |
|
|
 Padawan
Joined: 23 May 2005 Posts: 1716
|
not every channel has a status (e.g. when it was never active). _________________ Regards, Butcher |
|
Back to top |
|
 |
mqjeff |
Posted: Sun Mar 15, 2009 11:51 pm Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
fireguok wrote: |
My objective is to list status of all the channel no matther what the status is. |
Then you need to change the code.
Quote: |
Can I use PCF here? |
Yes. |
|
Back to top |
|
 |
fireguok |
Posted: Mon Mar 16, 2009 12:13 am Post subject: |
|
|
Novice
Joined: 03 Apr 2007 Posts: 22
|
How can i change the code? |
|
Back to top |
|
 |
|