Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Friday, November 30, 2007

java code for MQ Cluster Monitor

/*
* @(#)MQClusterMonitor.java 1.7 05/09/19
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import java.util.HashMap;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

import javax.management.*;
import javax.management.remote.*;
import javax.management.openmbean.CompositeData;

import com.sun.messaging.AdminConnectionFactory;
import com.sun.messaging.AdminConnectionConfiguration;
import com.sun.messaging.jms.management.server.*;


public class MQClusterMonitor implements ActionListener,
Runnable {

JFrame f;
MQConnectDialog connectDialog = null;
JMenuItem exit, connect, disconnect;
JTextArea logMsgArea, statusTextArea;
JLabel brokerAddress;
JTable clsTable;

String address = null, adminUser = "admin", adminPasswd = "admin";

boolean stopRequested = false;
long seconds = 2;

AdminConnectionFactory acf;
JMXConnector jmxc;
MBeanServerConnection mbsc;
ObjectName clsMon = null;
NotificationFilterSupport myFilter = null;

public MQClusterMonitor(JFrame f, String address,
String adminUser, String adminPasswd,
long seconds) {
this.f = f;
this.address = address;
this.adminUser = adminUser;
this.adminPasswd = adminPasswd;
this.seconds = seconds;

try {
clsMon = new ObjectName(MQObjectName.CLUSTER_MONITOR_MBEAN_NAME);
} catch (Exception e) {
addStatusText("Caught exception while creating Log MBean ObjectName: " + e);
}

initGUI();

if ((address != null) && (adminUser != null) && (adminPasswd != null)) {
doConnect();
}
}

public synchronized void requestStop() {
stopRequested = true;
ClusterTableModel m = (ClusterTableModel)clsTable.getModel();
m.load(null);
}

public synchronized void resetStop() {
stopRequested = false;
}

public synchronized boolean stopRequested() {
return (stopRequested);
}

public void run() {
addStatusText("Monitor thread started (refresh interval = "
+ seconds
+ " seconds).");

while (true) {
try {
Thread.sleep(seconds * 1000);
if (stopRequested()) {
addStatusText("Monitor thread stopped");
break;
}
} catch (java.lang.InterruptedException ie) {
addStatusText("Exception caught while waiting to reload: " + ie);
}

load();
}
}

public void load() {
try {
CompositeData cd[] = (CompositeData[])mbsc.invoke(clsMon,
ClusterOperations.GET_BROKER_INFO,
null, null);

ClusterTableModel m = (ClusterTableModel)clsTable.getModel();
m.load(cd);
} catch (Exception e) {
addStatusText("Exception caught while reloading data: " + e);
e.printStackTrace();
}
}

private void initGUI() {
JMenuBar menubar = createMenubar();
JComponent toolbar = createToolBar();
JPanel mainPanel = createMainPanel();
JPanel statusArea = createStatusArea();

f.setJMenuBar(menubar);
f.getContentPane().add(toolbar, BorderLayout.NORTH);
f.getContentPane().add(mainPanel, BorderLayout.CENTER);
f.getContentPane().add(statusArea, BorderLayout.SOUTH);
}

public void addStatusText(String statusText) {
statusTextArea.append(statusText);
statusTextArea.setCaretPosition(statusTextArea.getText().length());
statusTextArea.append("\n");
}

public void clearStatus() {
statusTextArea.setText("");
}

public void doConnect() {
try {
acf = new AdminConnectionFactory();
if (address != null) {
acf.setProperty(AdminConnectionConfiguration.imqAddress,
address);
}
jmxc = acf.createConnection(adminUser, adminPasswd);
mbsc = jmxc.getMBeanServerConnection();

addStatusText("Connected to broker at: "
+ acf.getProperty(AdminConnectionConfiguration.imqAddress));

brokerAddress.setText(
acf.getProperty(AdminConnectionConfiguration.imqAddress));

resetStop();

new Thread(this).start();

connect.setEnabled(false);
disconnect.setEnabled(true);
} catch (Exception e) {
addStatusText("Caught exception while connecting: " + e);
}
}

public void doDisconnect() {
try {
requestStop();

addStatusText("Disconnecting from broker at: "
+ acf.getProperty(AdminConnectionConfiguration.imqAddress));

brokerAddress.setText("");

if (jmxc != null) {
jmxc.close();
}
jmxc = null;
mbsc = null;
acf = null;
connect.setEnabled(true);
disconnect.setEnabled(false);
} catch (Exception e) {
addStatusText("Caught exception while disconnecting: " + e);
}
}

private JMenuBar createMenubar() {
JMenuBar menubar;
JMenu menu, logLevelMenu;

menubar = new JMenuBar();

menu = new JMenu("ClusterMonitor");
menubar.add(menu);

connect = new JMenuItem("Connect");
connect.addActionListener(this);
menu.add(connect);

disconnect = new JMenuItem("Disconnect");
disconnect.addActionListener(this);
disconnect.setEnabled(false);
menu.add(disconnect);

menu.addSeparator();

exit = new JMenuItem("Exit");
exit.addActionListener(this);
menu.add(exit);

return (menubar);
}

private JPanel createMainPanel() {
JPanel p = new JPanel();

p.setLayout(new BorderLayout());

clsTable = new JTable(new ClusterTableModel()) {
public TableCellRenderer getCellRenderer(int row, int col) {
DefaultTableCellRenderer rowRenderer;

if (col != 2) {
return (super.getCellRenderer(row, col));
}

int state = getBrokerState(row);

switch (state) {
case BrokerState.TAKEOVER_COMPLETE:
rowRenderer = new DefaultTableCellRenderer();
rowRenderer.setBackground(Color.yellow);
return (rowRenderer);

case BrokerState.BROKER_DOWN:
case BrokerState.TAKEOVER_STARTED:
case BrokerState.SHUTDOWN_STARTED:
rowRenderer = new DefaultTableCellRenderer();
rowRenderer.setBackground(Color.red);
return (rowRenderer);

/*
* default case handles:
* BrokerState.OPERATING:
* BrokerState.QUIESCE_STARTED:
* BrokerState.QUIESCE_COMPLETE:
*/
default:
return (super.getCellRenderer(row, col));
}
}

public int getBrokerState(int row) {
ClusterTableModel m = (ClusterTableModel)clsTable.getModel();

return (m.getBrokerState(row));
}

};

JScrollPane tablePane = new JScrollPane(clsTable);
tablePane.setPreferredSize(new Dimension(640, 100));
p.add(BorderLayout.CENTER, tablePane);


return (p);
}

private JComponent createToolBar() {
JPanel p = new JPanel();
JLabel l;

p.setLayout(new FlowLayout(FlowLayout.LEFT));

l = new JLabel("Cluster state as reported by broker at address: ");
p.add(l);

brokerAddress = new JLabel("");
p.add(brokerAddress);

return (p);
}

private JPanel createStatusArea() {
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
statusTextArea = new JTextArea(5, 60);
statusTextArea.setLineWrap(true);
statusTextArea.setEditable(false);
JScrollPane statusTextPane = new JScrollPane(statusTextArea);
p.add(statusTextPane, BorderLayout.CENTER);

return (p);
}

public void actionPerformed(ActionEvent e) {
Object src = e.getSource();

if (src instanceof JMenuItem) {
JMenuItem mi = (JMenuItem)src;

if (src == exit) {
System.exit(0);
} else if (src == connect) {
showConnectDialog();
} else if (src == disconnect) {
doDisconnect();
}
} else if (src instanceof JButton) {
address = connectDialog.getAddress();
adminUser = connectDialog.getUserName();
adminPasswd = connectDialog.getPassword();

doConnect();
}
}

private void showConnectDialog() {
if (connectDialog == null) {
connectDialog = new MQConnectDialog(f, "Connect to Broker", this);

connectDialog.setAddress((address == null) ?
getDefaultAddress() : address);
connectDialog.setUserName((adminUser == null) ?
getDefaultUserName() : adminUser);
connectDialog.setPassword((adminPasswd == null) ?
getDefaultPassword() : adminPasswd);
}
connectDialog.setLocationRelativeTo(f);
connectDialog.setVisible(true);
}

private static void doExit() {
System.exit(0);
}

private String getDefaultUserName() {
AdminConnectionFactory acf = new AdminConnectionFactory();
String addr;

try {
addr = acf.getProperty(AdminConnectionConfiguration.imqDefaultAdminUsername);
} catch(Exception e) {
addr = null;
}

return (addr);
}

private String getDefaultPassword() {
AdminConnectionFactory acf = new AdminConnectionFactory();
String addr;

try {
addr = acf.getProperty(AdminConnectionConfiguration.imqDefaultAdminPassword);
} catch(Exception e) {
addr = null;
}

return (addr);
}

private String getDefaultAddress() {
/*
AdminConnectionFactory acf = new AdminConnectionFactory();
String addr;

try {
addr = acf.getProperty(AdminConnectionConfiguration.imqAddress);
} catch(Exception e) {
addr = null;
}

return (addr);
*/
return ("localhost:7676");
}

public static void main(String[] args) {
JFrame frame;
MQClusterMonitor s;
String address = null, adminUser = null, adminPasswd = null,
secondStr = null;
long seconds = 2;

for (int i = 0; i < args.length; ++i) {
if (args[i].equals("-b")) {
if (++i >= args.length) {
usage();
}
address = args[i];
} else if (args[i].equals("-u")) {
if (++i >= args.length) {
usage();
}
adminUser = args[i];
} else if (args[i].equals("-p")) {
if (++i >= args.length) {
usage();
}
adminPasswd = args[i];
} else if (args[i].equals("-int")) {
if (++i >= args.length) {
usage();
}
secondStr = args[i];

try {
seconds = Long.valueOf(secondStr).longValue();
} catch(NumberFormatException nfe) {
usage("Failed to parse interval value: " + secondStr);
}
} else {
usage();
}
}

frame = new JFrame("MQ Cluster Monitor");
s = new MQClusterMonitor(frame, address, adminUser, adminPasswd, seconds);

frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
doExit();
}
});

frame.pack();
frame.setVisible(true);
}

public static void usage() {
usage(null);
}

public static void usage(String msg) {
if (msg != null) {
System.err.println(msg);
}

System.err.println("java MQClusterMonitor"
+ "[-b ] [-u ] [-p ]");
doExit();
}
}

class ClusterTableModel extends AbstractTableModel {
private String[] columnNames = {"Broker ID",
"Broker Address",
"Broker State",
"# Msgs in Store",
"Takeover Broker ID",
"Time since last status timestamp"};

CompositeData clusterInfo[];

public ClusterTableModel() {
}

public void load(CompositeData cd[]) {
if (cd != null) {
clusterInfo = cd;
} else {
clusterInfo = null;
}
fireTableDataChanged();
}

public int getRowCount() {
if (clusterInfo == null) {
return (0);
}

return (clusterInfo.length);
}

public int getColumnCount() {
return (columnNames.length);
}

public String getColumnName(int column) {
return columnNames[column];
}

public Object getValueAt(int row, int column) {
if ((clusterInfo == null) || (clusterInfo.length == 0)) {
return ("");
}

CompositeData info = clusterInfo[row];

switch (column) {

case 0:
return (info.get(BrokerClusterInfo.ID));

case 1:
return (info.get(BrokerClusterInfo.ADDRESS));

case 2:
return (BrokerState.toString(((Integer)
info.get(BrokerClusterInfo.STATE)).intValue()));

case 3:
return ((info.get(BrokerClusterInfo.NUM_MSGS)).toString());

case 4:
return (info.get(BrokerClusterInfo.TAKEOVER_BROKER_ID));

case 5:
long tmpLong = ((Long)info.get(BrokerClusterInfo.STATUS_TIMESTAMP)).longValue();
long idle = System.currentTimeMillis() - tmpLong;

return (getTimeString(idle));
}

return ("");
}

public int getBrokerState(int row) {
if ((clusterInfo == null) || (clusterInfo.length == 0)) {
return (BrokerState.BROKER_DOWN);
}

CompositeData info = clusterInfo[row];

if (info == null) {
return (BrokerState.BROKER_DOWN);
}

int state = ((Integer)info.get(BrokerClusterInfo.STATE)).intValue();

return (state);
}

private String getTimeString(long millis) {
String ret = null;

if (millis < 1000) {
ret = millis + " milliseconds";
} else if (millis < (60 * 1000)) {
long seconds = millis / 1000;
ret = seconds + " seconds";
} else if (millis < (60 * 60 * 1000)) {
long mins = millis / (60 * 1000);
ret = mins + " minutes";
} else {
ret = "> 1 hour";
}

return (ret);
}
}


/*
* @(#)MQConnectDialog.java 1.1 05/06/06
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MQConnectDialog extends JDialog
implements ActionListener {
JButton apply, cancel;
JTextField address, username;
JPasswordField password;

private boolean applyHit = false;
private ActionListener applyListener = null;

public MQConnectDialog(Frame parent, String title,
ActionListener applyListener) {
super(parent, title, true);
this.applyListener = applyListener;
initContentPane();
pack();
}

public boolean applyDone() {
return (applyHit);
}

private void initContentPane() {
JPanel panel = new JPanel();

panel.setLayout(new BorderLayout());
/*
* Create 'work' panel
*/
JPanel workPanel = createWorkPanel();

/*
* Create button panel
*/
JPanel buttonPanel = createButtonPanel();

panel.add(workPanel, "Center");
panel.add(buttonPanel, "South");

getContentPane().add(panel);
}

private JPanel createWorkPanel() {
JPanel workPanel = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
JLabel l;

workPanel.setLayout(gridbag);

c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.NONE;
c.insets = new Insets(2, 2, 2, 2);
c.ipadx = 0;
c.ipady = 0;
c.weightx = 1.0;

c.gridx = 0;
c.gridy = 0;
l = new JLabel("Address:");
gridbag.setConstraints(l,c);
workPanel.add(l);

c.gridx = 1;
c.gridy = 0;
address = new JTextField(20);
gridbag.setConstraints(address,c);
workPanel.add(address);

c.gridx = 0;
c.gridy = 1;
l = new JLabel("Name:");
gridbag.setConstraints(l,c);
workPanel.add(l);

c.gridx = 1;
c.gridy = 1;
username = new JTextField(20);
gridbag.setConstraints(username, c);
workPanel.add(username);

c.gridx = 0;
c.gridy = 2;
l = new JLabel("Password:");
gridbag.setConstraints(l,c);
workPanel.add(l);

c.gridx = 1;
c.gridy = 2;
password = new JPasswordField(20);
gridbag.setConstraints(password, c);
workPanel.add(password);

return (workPanel);
}

public void setAddress(String s) {
address.setText(s);
}
public String getAddress() {
return (address.getText());
}

public void setUserName(String s) {
username.setText(s);
}
public String getUserName() {
return (username.getText());
}

public void setPassword(String s) {
password.setText(s);
}
public String getPassword() {
return (new String(password.getPassword()));
}

private JPanel createButtonPanel() {
JPanel buttonPanel = new JPanel();

buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));

apply = new JButton("Apply");
apply.addActionListener(this);
if (applyListener != null) {
apply.addActionListener(applyListener);
}
buttonPanel.add(apply);

cancel = new JButton("Cancel");
cancel.addActionListener(this);
buttonPanel.add(cancel);

return (buttonPanel);
}

public void actionPerformed(ActionEvent e) {
Object src = e.getSource();

if (src == apply) {
applyHit = true;
setVisible(false);
} else if (src == cancel) {
applyHit = false;
setVisible(false);
}
}
}

No comments: