/// <summary> /// Releases the unmanaged resources used by the <see cref="IaonSession"/> object and optionally releases the managed resources. /// </summary> /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param> protected virtual void Dispose(bool disposing) { if (!m_disposed) { try { if (disposing) { DataSet dataSource = this.DataSource; // Dispose input adapters collection if (m_inputAdapters != null) { m_inputAdapters.Stop(); if (m_useMeasurementRouting) m_inputAdapters.NewMeasurements -= m_routingTables.RoutedMeasurementsHandler; else m_inputAdapters.NewMeasurements -= m_routingTables.BroadcastMeasurementsHandler; m_inputAdapters.ProcessingComplete -= ProcessingCompleteHandler; m_inputAdapters.Dispose(); } m_inputAdapters = null; // Dispose action adapters collection if (m_actionAdapters != null) { m_actionAdapters.Stop(); if (m_useMeasurementRouting) m_actionAdapters.NewMeasurements -= m_routingTables.RoutedMeasurementsHandler; else m_actionAdapters.NewMeasurements -= m_routingTables.BroadcastMeasurementsHandler; m_actionAdapters.UnpublishedSamples -= UnpublishedSamplesHandler; m_actionAdapters.Dispose(); } m_actionAdapters = null; // Dispose output adapters collection if (m_outputAdapters != null) { m_outputAdapters.Stop(); m_outputAdapters.UnprocessedMeasurements -= UnprocessedMeasurementsHandler; m_outputAdapters.Dispose(); } m_outputAdapters = null; // Dispose all adapters collection if (m_allAdapters != null) { m_allAdapters.StatusMessage -= StatusMessageHandler; m_allAdapters.ProcessException -= ProcessExceptionHandler; m_allAdapters.InputMeasurementKeysUpdated -= InputMeasurementKeysUpdatedHandler; m_allAdapters.OutputMeasurementsUpdated -= OutputMeasurementsUpdatedHandler; m_allAdapters.Disposed -= DisposedHandler; m_allAdapters.Dispose(); } m_allAdapters = null; // Dispose of routing tables if (m_routingTables != null) { m_routingTables.ProcessException -= m_routingTables_ProcessException; m_routingTables.Dispose(); } m_routingTables = null; // Dispose of wait handle dictionary if (m_waitHandles != null) { foreach (AutoResetEvent waitHandle in m_waitHandles.Values) { if (waitHandle != null) waitHandle.Close(); } m_waitHandles.Clear(); } m_waitHandles = null; if ((object)dataSource != null) dataSource.Dispose(); } } finally { m_disposed = true; // Prevent duplicate dispose. if (Disposed != null) Disposed(this, EventArgs.Empty); } } }
/// <summary> /// Creates a new <see cref="IaonSession"/>. /// </summary> public IaonSession() { //ConfigurationFile configFile = ConfigurationFile.Current; // Initialize system settings //CategorizedSettingsElementCollection systemSettings = configFile.Settings["systemSettings"]; //systemSettings.Add("NodeID", Guid.NewGuid().ToString(), "Unique Node ID"); //systemSettings.Add("UseMeasurementRouting", DefaultUseMeasurementRouting, "Set to true to use optimized adapter measurement routing."); //m_nodeID = systemSettings["NodeID"].ValueAs<Guid>(); //m_useMeasurementRouting = systemSettings["UseMeasurementRouting"].ValueAsBoolean(IaonSession.DefaultUseMeasurementRouting); m_nodeID = Guid.NewGuid(); m_useMeasurementRouting = true; //// Initialize threshold settings //CategorizedSettingsElementCollection thresholdSettings = configFile.Settings["thresholdSettings"]; //thresholdSettings.Add("MeasurementWarningThreshold", "100000", "Number of unarchived measurements allowed in any output adapter queue before displaying a warning message"); //thresholdSettings.Add("MeasurementDumpingThreshold", "500000", "Number of unarchived measurements allowed in any output adapter queue before taking evasive action and dumping data"); //thresholdSettings.Add("DefaultSampleSizeWarningThreshold", "10", "Default number of unpublished samples (in seconds) allowed in any action adapter queue before displaying a warning message"); //m_measurementWarningThreshold = thresholdSettings["MeasurementWarningThreshold"].ValueAsInt32(); //m_measurementDumpingThreshold = thresholdSettings["MeasurementDumpingThreshold"].ValueAsInt32(); //m_defaultSampleSizeWarningThreshold = thresholdSettings["DefaultSampleSizeWarningThreshold"].ValueAsInt32(); m_measurementWarningThreshold = 100000; m_measurementDumpingThreshold = 500000; m_defaultSampleSizeWarningThreshold = 10; // Create a common wait handle dictionary for all adapters in this session m_waitHandles = new ConcurrentDictionary<string, AutoResetEvent>(StringComparer.InvariantCultureIgnoreCase); // Create a cache for derived adapter names m_derivedNameCache = new ConcurrentDictionary<object, string>(); // Create a new set of routing tables m_routingTables = new RoutingTables(); m_routingTables.ProcessException += m_routingTables_ProcessException; // Create a collection to manage all input, action and output adapter collections as a unit m_allAdapters = new AllAdaptersCollection(m_waitHandles); // Attach to common adapter events m_allAdapters.StatusMessage += StatusMessageHandler; m_allAdapters.ProcessException += ProcessExceptionHandler; m_allAdapters.InputMeasurementKeysUpdated += InputMeasurementKeysUpdatedHandler; m_allAdapters.OutputMeasurementsUpdated += OutputMeasurementsUpdatedHandler; m_allAdapters.Disposed += DisposedHandler; // Create input adapters collection m_inputAdapters = new InputAdapterCollection(m_waitHandles); if (m_useMeasurementRouting) m_inputAdapters.NewMeasurements += m_routingTables.RoutedMeasurementsHandler; else m_inputAdapters.NewMeasurements += m_routingTables.BroadcastMeasurementsHandler; m_inputAdapters.ProcessMeasurementFilter = !m_useMeasurementRouting; m_inputAdapters.ProcessingComplete += ProcessingCompleteHandler; // Create action adapters collection m_actionAdapters = new ActionAdapterCollection(m_waitHandles); if (m_useMeasurementRouting) m_actionAdapters.NewMeasurements += m_routingTables.RoutedMeasurementsHandler; else m_actionAdapters.NewMeasurements += m_routingTables.BroadcastMeasurementsHandler; m_actionAdapters.ProcessMeasurementFilter = !m_useMeasurementRouting; m_actionAdapters.UnpublishedSamples += UnpublishedSamplesHandler; // Create output adapters collection m_outputAdapters = new OutputAdapterCollection(m_waitHandles); m_outputAdapters.ProcessMeasurementFilter = !m_useMeasurementRouting; m_outputAdapters.UnprocessedMeasurements += UnprocessedMeasurementsHandler; // Associate adapter collections with routing tables m_routingTables.InputAdapters = m_inputAdapters; m_routingTables.ActionAdapters = m_actionAdapters; m_routingTables.OutputAdapters = m_outputAdapters; // We group these adapters such that they are initialized in the following order: output, input, action. This // is done so that the archival capabilities will be setup before we start receiving input and the input data // will be flowing before any actions get established for the input - at least generally. m_allAdapters.Add(m_outputAdapters); m_allAdapters.Add(m_inputAdapters); m_allAdapters.Add(m_actionAdapters); }
/// <summary> /// Creates a new <see cref="IaonSession"/>. /// </summary> public IaonSession() { ConfigurationFile configFile = ConfigurationFile.Current; // Initialize system settings CategorizedSettingsElementCollection systemSettings = configFile.Settings["systemSettings"]; systemSettings.Add("NodeID", Guid.NewGuid().ToString(), "Unique Node ID"); m_nodeID = systemSettings["NodeID"].ValueAs<Guid>(); // Initialize threshold settings CategorizedSettingsElementCollection thresholdSettings = configFile.Settings["thresholdSettings"]; thresholdSettings.Add("MeasurementWarningThreshold", "100000", "Number of unarchived measurements allowed in any output adapter queue before displaying a warning message"); thresholdSettings.Add("MeasurementDumpingThreshold", "500000", "Number of unarchived measurements allowed in any output adapter queue before taking evasive action and dumping data"); thresholdSettings.Add("DefaultSampleSizeWarningThreshold", "10", "Default number of unpublished samples (in seconds) allowed in any action adapter queue before displaying a warning message"); m_measurementWarningThreshold = thresholdSettings["MeasurementWarningThreshold"].ValueAsInt32(); m_measurementDumpingThreshold = thresholdSettings["MeasurementDumpingThreshold"].ValueAsInt32(); m_defaultSampleSizeWarningThreshold = thresholdSettings["DefaultSampleSizeWarningThreshold"].ValueAsInt32(); // Create a new set of routing tables m_routingTables = new RoutingTables(); m_routingTables.StatusMessage += m_routingTables_StatusMessage; m_routingTables.ProcessException += m_routingTables_ProcessException; // Create a collection to manage all input, action and output adapter collections as a unit m_allAdapters = new AllAdaptersCollection(); // Attach to common adapter events m_allAdapters.StatusMessage += StatusMessageHandler; m_allAdapters.ProcessException += ProcessExceptionHandler; m_allAdapters.InputMeasurementKeysUpdated += InputMeasurementKeysUpdatedHandler; m_allAdapters.OutputMeasurementsUpdated += OutputMeasurementsUpdatedHandler; m_allAdapters.ConfigurationChanged += ConfigurationChangedHandler; m_allAdapters.Disposed += DisposedHandler; // Create input adapters collection m_inputAdapters = new InputAdapterCollection(); m_inputAdapters.ProcessingComplete += ProcessingCompleteHandler; // Create action adapters collection m_actionAdapters = new ActionAdapterCollection(); m_actionAdapters.UnpublishedSamples += UnpublishedSamplesHandler; m_actionAdapters.RequestTemporalSupport += RequestTemporalSupportHandler; // Create output adapters collection m_outputAdapters = new OutputAdapterCollection(); m_outputAdapters.UnprocessedMeasurements += UnprocessedMeasurementsHandler; // Associate adapter collections with routing tables m_routingTables.InputAdapters = m_inputAdapters; m_routingTables.ActionAdapters = m_actionAdapters; m_routingTables.OutputAdapters = m_outputAdapters; // We group these adapters such that they are initialized in the following order: output, input, action. This // is done so that the archival capabilities will be setup before we start receiving input and the input data // will be flowing before any actions get established for the input - at least generally. m_allAdapters.Add(m_outputAdapters); m_allAdapters.Add(m_inputAdapters); m_allAdapters.Add(m_actionAdapters); m_requestTemporalSupportLock = new object(); }
/// <summary> /// Releases the unmanaged resources used by the <see cref="IaonSession"/> object and optionally releases the managed resources. /// </summary> /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param> protected virtual void Dispose(bool disposing) { if (!m_disposed) { try { if (disposing) { DataSet dataSource = DataSource; // Dispose input adapters collection if (m_inputAdapters != null) { m_inputAdapters.Stop(); m_inputAdapters.ProcessingComplete -= ProcessingCompleteHandler; m_inputAdapters.Dispose(); } m_inputAdapters = null; // Dispose action adapters collection if (m_actionAdapters != null) { m_actionAdapters.Stop(); m_actionAdapters.UnpublishedSamples -= UnpublishedSamplesHandler; m_actionAdapters.RequestTemporalSupport -= RequestTemporalSupportHandler; m_actionAdapters.Dispose(); } m_actionAdapters = null; // Dispose output adapters collection if (m_outputAdapters != null) { m_outputAdapters.Stop(); m_outputAdapters.UnprocessedMeasurements -= UnprocessedMeasurementsHandler; m_outputAdapters.Dispose(); } m_outputAdapters = null; // Dispose all adapters collection if (m_allAdapters != null) { m_allAdapters.StatusMessage -= StatusMessageHandler; m_allAdapters.ProcessException -= ProcessExceptionHandler; m_allAdapters.InputMeasurementKeysUpdated -= InputMeasurementKeysUpdatedHandler; m_allAdapters.OutputMeasurementsUpdated -= OutputMeasurementsUpdatedHandler; m_allAdapters.ConfigurationChanged -= ConfigurationChangedHandler; m_allAdapters.Disposed -= DisposedHandler; m_allAdapters.Dispose(); } m_allAdapters = null; // Dispose of routing tables if (m_routingTables != null) { m_routingTables.StatusMessage -= m_routingTables_StatusMessage; m_routingTables.ProcessException -= m_routingTables_ProcessException; m_routingTables.Dispose(); } m_routingTables = null; if ((object)dataSource != null) dataSource.Dispose(); } } finally { m_disposed = true; // Prevent duplicate dispose. if (Disposed != null) Disposed(this, EventArgs.Empty); } } }
/// <summary> /// Releases the unmanaged resources used by the <see cref="RoutingTables"/> object and optionally releases the managed resources. /// </summary> /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param> protected virtual void Dispose(bool disposing) { if (!m_disposed) { try { if (disposing) { m_inputAdapters = null; m_actionAdapters = null; m_outputAdapters = null; } } finally { m_disposed = true; // Prevent duplicate dispose. } } }