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;
}
}