//****************************************************************************************************** // ServiceMonitors.cs - Gbtc // // Copyright © 2014, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://www.opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 04/29/2014 - Stephen C. Wills // Generated original version of source code. // //****************************************************************************************************** using System; using GSF.Adapters; namespace GSF.ServiceProcess { /// /// A special exception thrown by error handlers. /// public class ErrorHandlerException : Exception { /// /// Creates a new instance of the class. /// public ErrorHandlerException() { } /// /// Creates a new instance of the class. /// /// The message that describes the error. public ErrorHandlerException(string message) : base(message) { } /// /// Creates a new instance of the class. /// /// The message that describes the error. /// The exception that is the cause of the current exception, or a null reference if no inner exception is specified. public ErrorHandlerException(string message, Exception innerException) : base(message, innerException) { } } /// /// Adapter loader that loads implementations of /// and delegates messages to the enabled monitors. /// public class ServiceMonitors : AdapterLoader { /// /// Handles notifications from the service that occur /// on an interval to indicate that the service is /// still running. /// public void HandleServiceHeartbeat() { OperationQueue.Enqueue(new Action(serviceMonitor => serviceMonitor.HandleServiceHeartbeat())); } /// /// Handles messages received by the service /// whenever the service encounters an error. /// /// The exception received from the service. public void HandleServiceError(Exception ex) { OperationQueue.Enqueue(new Action(serviceMonitor => { try { serviceMonitor.HandleServiceError(ex); } catch (Exception errorHandlerException) { throw new ErrorHandlerException(errorHandlerException.Message, errorHandlerException); } })); } /// /// Handles messages sent by a client. /// /// Arguments provided by the client. public void HandleClientMessage(string[] args) { OperationQueue.Enqueue(new Action(serviceMonitor => serviceMonitor.HandleClientMessage(args))); } /// /// Executes an operation on the with the given . /// /// Adapter on which an operation is to be executed. /// The operation to be executed. protected override void ExecuteAdapterOperation(IServiceMonitor adapter, object data) { Action operation = data as Action; if ((object)operation != null) operation(adapter); } } }