Package com.opengamma.livedata.server

Source Code of com.opengamma.livedata.server.LiveDataServerMBean

/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.server;

import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;
import org.springframework.jmx.export.annotation.ManagedResource;

import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.opengamma.id.ExternalScheme;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.msg.LiveDataSubscriptionResponse;
import com.opengamma.livedata.msg.LiveDataSubscriptionResult;
import com.opengamma.livedata.server.distribution.MarketDataDistributor;
import com.opengamma.util.ArgumentChecker;

/**
* JMX management of a LiveData server.
*/
@ManagedResource(
    description = "LiveData server attributes and operations that can be managed via JMX"
    )
public class LiveDataServerMBean {

  /** Logger. */
  private static final Logger s_logger = LoggerFactory.getLogger(LiveDataServerMBean.class);

  /**
   * The underlying live data server.
   */
  private final StandardLiveDataServer _server;

  /**
   * Creates an instance.
   *
   * @param server  the underlying live data server, not null
   */
  public LiveDataServerMBean(StandardLiveDataServer server) {
    ArgumentChecker.notNull(server, "server");
    _server = server;
  }

  protected StandardLiveDataServer getServer() {
    return _server;
  }

  @ManagedAttribute(description = "The unique id domain of the underlying server.")
  public String getUniqueIdDomain() {
    try {
      ExternalScheme uniqueIdDomain = getServer().getUniqueIdDomain();
      return uniqueIdDomain == null ? "<null>" : uniqueIdDomain.toString();
    } catch (RuntimeException e) {
      s_logger.error("getUniqueIdDomain() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "The connection status of the underlying server.")
  public String getConnectionStatus() {
    try {
      return getServer().getConnectionStatus().toString();
    } catch (RuntimeException e) {
      s_logger.error("getConnectionStatus() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "The type of the underlying server.")
  public String getServerType() {
    try {
      return getServer().getClass().getName();
    } catch (RuntimeException e) {
      s_logger.error("getServerType() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "How many different tickers the server subscribes to.")
  public int getNumActiveSubscriptions() {
    try {
      return getServer().getNumActiveSubscriptions();
    } catch (RuntimeException e) {
      s_logger.error("getNumActiveSubscriptions() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "Security IDs the server subscribes to."
      + " The form of the IDs is dependent on the source system"
      + " - Reuters RICs, Bloomberg unique IDs, etc.")
  public Set<String> getActiveSubscriptionIds() {
    try {
      return getServer().getActiveSubscriptionIds();
    } catch (RuntimeException e) {
      s_logger.error("getActiveSubscriptionIds() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "JMS topics the server publishes to.")
  public Set<String> getActiveDistributionSpecs() {
    try {
      return getServer().getActiveDistributionSpecs();
    } catch (RuntimeException e) {
      s_logger.error("getActiveDistributionSpecs() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "The number of market data updates the server has processed in its lifetime.")
  public long getNumMarketDataUpdatesReceived() {
    try {
      return getServer().getNumMarketDataUpdatesReceived();
    } catch (RuntimeException e) {
      s_logger.error("getNumLiveDataUpdatesSent() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedAttribute(description = "# of market data updates/sec, calculated over the last 60 seconds")
  public double getNumLiveDataUpdatesSentPerSecondOverLastMinute() {
    try {
      return getServer().getNumLiveDataUpdatesSentPerSecondOverLastMinute();
    } catch (RuntimeException e) {
      s_logger.error("getNumLiveDataUpdatesSentPerSecondOverLastMinute() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Subscribes to market data. The subscription will be non-persistent."
      + " If the server already subscribes to the given market data, this method is a "
      + " no-op. Returns the name of the JMS topic market data will be published on.")
  @ManagedOperationParameters({
      @ManagedOperationParameter(name = "securityUniqueId", description = "Security unique ID. Server type dependent.)") })
  public String subscribe(String securityUniqueId) {
    try {
      LiveDataSubscriptionResponse response = getServer().subscribe(securityUniqueId);
      if (response.getSubscriptionResult() != LiveDataSubscriptionResult.SUCCESS) {
        throw new RuntimeException("Unsuccessful subscription: " + response.getUserMessage());
      }
      return response.getTickDistributionSpecification();
    } catch (RuntimeException e) {
      s_logger.error("subscribe(" + securityUniqueId + ") failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Subscribes to market data. The subscription will be persistent."
      + " If the server already subscribes to the given market data, this method will make the "
      + " subscription persistent. Returns the name of the JMS topic market data will be published on.")
  @ManagedOperationParameters({ @ManagedOperationParameter(name = "securityUniqueId", description = "Security unique ID. Server type dependent.)") })
  public String subscribePersistently(String securityUniqueId) {
    try {
      LiveDataSpecification spec = getServer().getLiveDataSpecification(securityUniqueId);
      LiveDataSubscriptionResponse response = getServer().subscribe(spec, true);
      if (response.getSubscriptionResult() != LiveDataSubscriptionResult.SUCCESS) {
        throw new RuntimeException("Unsuccessful subscription: " + response.getUserMessage());
      }
      return response.getTickDistributionSpecification();
    } catch (RuntimeException e) {
      s_logger.error("subscribe(" + securityUniqueId + ") failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Converts all subscriptions to persistent.")
  public void subscribeAllPersistently() {
    setPersistenceForAll(true);
  }

  @ManagedOperation(description = "Converts all subscriptions to non-persistent.")
  public void unpersistAllSubscribtions() {
    setPersistenceForAll(false);
  }

  private void setPersistenceForAll(boolean persistent) {
    try {
      Set<String> activeSubscriptionIds = getServer().getActiveSubscriptionIds();
      for (String string : activeSubscriptionIds) {
        MarketDataDistributor marketDataDistributor = getServer().getMarketDataDistributor(string);
        marketDataDistributor.setPersistent(persistent);
      }
    } catch (RuntimeException e) {
      s_logger.error("Setting all susbcriptions to persistent=" + persistent + " failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Unsubscribes from market data. "
      + "Works even if the subscription is persistent. "
      + "Returns true if a market data subscription was actually removed,"
      + " false otherwise.")
  @ManagedOperationParameters({
       @ManagedOperationParameter(name = "securityUniqueId", description = "Security unique ID. Server type dependent.)") })
  public boolean unsubscribe(String securityUniqueId) {
    try {
      return getServer().unsubscribe(securityUniqueId);
    } catch (RuntimeException e) {
      s_logger.error("unsubscribe(" + securityUniqueId + ") failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Gets the current snapshot of a security. Will not cause an underlying snapshot.")
  @ManagedOperationParameters({
       @ManagedOperationParameter(name = "securityUniqueId", description = "Security unique ID. Server type dependent.)") })
  public String getSnapshot(String securityUniqueId) {
    MarketDataDistributor marketDataDistributor = getServer().getMarketDataDistributor(securityUniqueId);
    return marketDataDistributor != null && marketDataDistributor.getSnapshot() != null ? marketDataDistributor.getSnapshot().toString() : "Unknown";
  }

  @ManagedOperation(description = "Gets the current snapshot of all active securities. Will not cause any underlying snapshots.")
  public String[] getAllSnapshots() {
    try {
      Set<String> activeSubscriptionIds = getServer().getActiveSubscriptionIds();
      Iterable<String> results = Iterables.transform(activeSubscriptionIds, new Function<String, String>() {
        @Override
        public String apply(String from) {
          try {
            return getSnapshot(from);
          } catch (RuntimeException e) {
            return e.getMessage();
          }
        }
      });
      return Iterators.toArray(results.iterator(), String.class);
    } catch (RuntimeException e) {
      s_logger.error("getAllSnapshots() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Gets the current field history of a security. Will not cause an underlying snapshot.")
  @ManagedOperationParameters({ @ManagedOperationParameter(name = "securityUniqueId", description = "Security unique ID. Server type dependent.)") })
  public String getFieldHistory(String securityUniqueId) {
    try {
      Subscription subscription = getServer().getSubscription(securityUniqueId);
      if (subscription == null) {
        return null;
      }
      return subscription.getLiveDataHistory().getLastKnownValues().toString();
    } catch (RuntimeException e) {
      s_logger.error("getFieldHistory() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

  @ManagedOperation(description = "Gets the current field history of all active securities. Will not cause any underlying snapshots.")
  public String[] getAllFieldHistories() {
    try {
      Set<String> activeSubscriptionIds = getServer().getActiveSubscriptionIds();
      Iterable<String> results = Iterables.transform(activeSubscriptionIds, new Function<String, String>() {

        @Override
        public String apply(String from) {
          try {
            return getFieldHistory(from);
          } catch (RuntimeException e) {
            return e.getMessage();
          }
        }
      });
      return Iterators.toArray(results.iterator(), String.class);
    } catch (RuntimeException e) {
      s_logger.error("getAllFieldHistories() failed", e);
      throw new RuntimeException(e.getMessage());
    }
  }

}
TOP

Related Classes of com.opengamma.livedata.server.LiveDataServerMBean

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.