Package org.cyclopsgroup.jmxterm.cmd

Source Code of org.cyclopsgroup.jmxterm.cmd.SubscribeCommand

package org.cyclopsgroup.jmxterm.cmd;

import org.cyclopsgroup.jcli.annotation.Cli;
import org.cyclopsgroup.jcli.annotation.Option;
import org.cyclopsgroup.jmxterm.Command;
import org.cyclopsgroup.jmxterm.Session;

import javax.management.*;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
* Command to subscribe to an MBean notification
*
* All notifications will be printed to the output in the form of notification received: timestamp=xxx,class=xxx,source=xxx,type=xxx,message=xxx
* To remove the subscription call the unsubscribe in the terminal.
*/
@Cli( name = "subscribe", description = "Subscribe to the notifications of a bean", note = "Syntax is \n subscribe <bean>" )
public class SubscribeCommand
    extends Command
{
    private static Map<ObjectName, NotificationListener> listeners = new ConcurrentHashMap<ObjectName, NotificationListener>();

    public static Map<ObjectName, NotificationListener> getListeners() {
        return listeners;
    }

    public class BeanNotificationListener implements NotificationListener {

        @Override
        public void handleNotification(Notification notification, Object handback) {

            Session session = getSession();

            StringBuilder sb = new StringBuilder("notification received: ");
            sb.append("timestamp=").append(notification.getTimeStamp());
            sb.append(",class=").append(notification.getClass().getName());
            sb.append(",source=").append(notification.getSource());
            sb.append(",type=").append(notification.getType());
            sb.append(",message=").append(notification.getMessage());

            session.output.println(sb.toString());
        }
    }

    private String bean;

    private String domain;

    /**
     * @inheritDoc
     */
    @Override
    public void execute()
        throws MalformedObjectNameException, IOException, JMException
    {
        Session session = getSession();
        String beanName = BeanCommand.getBeanName( bean, domain, session );
        if ( beanName == null )
        {
            throw new IllegalArgumentException( "Please specify MBean to invoke either using -b option or bean command" );
        }

        ObjectName name = new ObjectName( beanName );
        if ( !listeners.containsKey( name ) )
        {
            MBeanServerConnection con = session.getConnection().getServerConnection();

            NotificationListener listener = new BeanNotificationListener();
            con.addNotificationListener( name, listener , null, null );
            listeners.put( name, listener );

            session.output.printMessage("Subscribed to " + name);
        }
    }

    /**
     * @param bean Bean under which the operation is
     */
    @Option( name = "b", longName = "bean", description = "MBean to invoke" )
    public final void setBean( String bean )
    {
        this.bean = bean;
    }

    /**
     * @param domain Domain under which is bean is
     */
    @Option( name = "d", longName = "domain", description = "Domain of MBean to invoke" )
    public final void setDomain( String domain )
    {
        this.domain = domain;
    }
}
TOP

Related Classes of org.cyclopsgroup.jmxterm.cmd.SubscribeCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.