Package com.opengamma.engine.calcnode.jmx

Source Code of com.opengamma.engine.calcnode.jmx.SimpleCalculationNodeInvocationContainer

/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.calcnode.jmx;

import javax.management.InstanceAlreadyExistsException;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.calcnode.SimpleCalculationNode;
import com.opengamma.engine.calcnode.SimpleCalculationNodeFactory;

/**
* JMX exposure of a node container.
*
* @param <T> the container type
*/
public class SimpleCalculationNodeInvocationContainer<T extends com.opengamma.engine.calcnode.SimpleCalculationNodeInvocationContainer> implements SimpleCalculationNodeInvocationContainerMBean {

  private static final Logger s_logger = LoggerFactory.getLogger(CalculationNodesMBean.class);

  private final T _container;
  private final SimpleCalculationNodeFactory _nodeFactory;

  protected SimpleCalculationNodeInvocationContainer(final T container, final SimpleCalculationNodeFactory nodeFactory) {
    _container = container;
    _nodeFactory = nodeFactory;
  }

  protected T getContainer() {
    return _container;
  }

  protected SimpleCalculationNodeFactory getNodeFactory() {
    return _nodeFactory;
  }

  protected void registerMBean(final MBeanServer server) throws JMException {
    final ObjectName name = new ObjectName("com.opengamma:type=CalculationNodes,name=" + getContainer().toString());
    try {
      server.registerMBean(this, name);
    } catch (InstanceAlreadyExistsException e) {
      s_logger.warn("JMX MBean {} already exists - replacing", name);
      server.unregisterMBean(name);
      server.registerMBean(this, name);
    }
  }

  public static void registerMBeans(final com.opengamma.engine.calcnode.SimpleCalculationNodeInvocationContainer container, final SimpleCalculationNodeFactory nodeFactory,
      final MBeanServer server) throws JMException {
    new SimpleCalculationNodeInvocationContainer<com.opengamma.engine.calcnode.SimpleCalculationNodeInvocationContainer>(container, nodeFactory).registerMBean(server);
  }

  @Override
  public int getTotalNodeCount() {
    return getContainer().getTotalNodeCount();
  }

  @Override
  public int getAvailableNodeCount() {
    return getContainer().getAvailableNodeCount();
  }

  @Override
  public int getTotalJobCount() {
    return getContainer().getTotalJobCount();
  }

  @Override
  public int getRunnableJobCount() {
    return getContainer().getRunnableJobCount();
  }

  @Override
  public int getPartialJobCount() {
    return getContainer().getPartialJobCount();
  }

  @Override
  public String removeNode() {
    for (int i = 10; i > 0; i--) {
      final SimpleCalculationNode node = getContainer().removeNode();
      if (node != null) {
        return "Removed " + node.getNodeId() + " from container";
      }
      if (getTotalNodeCount() == 0) {
        return "Total node count is zero";
      }
      if (i > 1) {
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          throw new OpenGammaRuntimeException("interrupted", e);
        }
      }
    }
    return "No available nodes to remove";
  }

  @Override
  public String addNode() {
    final SimpleCalculationNode node = getNodeFactory().createNode();
    getContainer().addNode(node);
    return "Added " + node.getNodeId() + " to container";
  }

}
TOP

Related Classes of com.opengamma.engine.calcnode.jmx.SimpleCalculationNodeInvocationContainer

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.