public SIPAppServerManager( SIPMonitorLogDelegate logDelegate, SIPTransport sipTransport, XmlNode appServerWorkersNode, string appServerEndPointsPath) { if (appServerWorkersNode == null || appServerWorkersNode.ChildNodes.Count == 0) { throw new ArgumentNullException("A SIPAppServerManager cannot be created with an empty workers node."); } SIPMonitorLogEvent_External = logDelegate; m_sipTransport = sipTransport; m_appServerWorkersNode = appServerWorkersNode; m_appServerEndPointsPath = appServerEndPointsPath; if (!appServerEndPointsPath.IsNullOrBlank() && File.Exists(appServerEndPointsPath)) { m_sipCallDispatcherFile = new SIPCallDispatcherFile(logDelegate, appServerEndPointsPath); } try { CallManagerPassThruServiceInstanceProvider callManagerPassThruSvcInstanceProvider = new CallManagerPassThruServiceInstanceProvider(this); m_callManagerPassThruSvcHost = new ServiceHost(typeof(CallManagerPassThruService)); m_callManagerPassThruSvcHost.Description.Behaviors.Add(callManagerPassThruSvcInstanceProvider); m_callManagerPassThruSvcHost.Open(); logger.Debug("SIPAppServerManager CallManagerPassThru hosted service successfully started on " + m_callManagerPassThruSvcHost.BaseAddresses[0].AbsoluteUri + "."); } catch (Exception excp) { logger.Warn("Exception starting SIPAppServerManager CallManagerPassThru hosted service. " + excp.Message); } foreach (XmlNode appServerWorkerNode in m_appServerWorkersNode.ChildNodes) { XmlNode workerNode = appServerWorkerNode; ThreadPool.QueueUserWorkItem(delegate { ManageWorker(workerNode); }); Thread.Sleep(1000); // Won't be able to start until all subsequnet workers are started anyway due to the need for the recycle lock. } }
public SIPProxyCore( SIPMonitorLogDelegate proxyLogger, SIPTransport sipTransport, string scriptPath, string appServerEndPointsPath) { try { m_proxyLogger = proxyLogger ?? m_proxyLogger; m_scriptPath = scriptPath; m_sipTransport = sipTransport; if (!appServerEndPointsPath.IsNullOrBlank() && File.Exists(appServerEndPointsPath)) { m_sipCallDispatcherFile = new SIPCallDispatcherFile(SendMonitorEvent, appServerEndPointsPath); m_sipCallDispatcherFile.LoadAndWatch(); } else { logger.Warn("No call dispatcher file specified for SIP Proxy."); } m_proxyDispatcher = new SIPProxyDispatcher(new SIPMonitorLogDelegate(SendMonitorEvent)); GetAppServerDelegate getAppServer = (m_sipCallDispatcherFile != null) ? new GetAppServerDelegate(m_sipCallDispatcherFile.GetAppServer) : null; m_proxyScriptFacade = new SIPProxyScriptFacade( new SIPMonitorLogDelegate(SendMonitorEvent), // Don't use the m_proxyLogger delegate directly here as doing so caused stack overflow exceptions in the IronRuby engine. sipTransport, m_proxyDispatcher, getAppServer); m_scriptLoader = new ScriptLoader(SendMonitorEvent, m_scriptPath); m_scriptLoader.ScriptFileChanged += (s, e) => { m_compiledScript = m_scriptLoader.GetCompiledScript(); }; m_compiledScript = m_scriptLoader.GetCompiledScript(); // Events that pass the SIP requests and responses onto the Stateless Proxy Core. m_sipTransport.SIPTransportRequestReceived += GotRequest; m_sipTransport.SIPTransportResponseReceived += GotResponse; } catch (Exception excp) { logger.Error("Exception SIPProxyCore (ctor). " + excp.Message); throw excp; } }
public SIPAppServerManager( SIPMonitorLogDelegate logDelegate, SIPTransport sipTransport, XmlNode appServerWorkersNode, string appServerEndPointsPath) { if (appServerWorkersNode == null || appServerWorkersNode.ChildNodes.Count == 0) { throw new ArgumentNullException("A SIPAppServerManager cannot be created with an empty workers node."); } SIPMonitorLogEvent_External = logDelegate; m_sipTransport = sipTransport; m_appServerWorkersNode = appServerWorkersNode; m_appServerEndPointsPath = appServerEndPointsPath; if (!appServerEndPointsPath.IsNullOrBlank() && File.Exists(appServerEndPointsPath)) { m_sipCallDispatcherFile = new SIPCallDispatcherFile(logDelegate, appServerEndPointsPath); } try { CallManagerPassThruServiceInstanceProvider callManagerPassThruSvcInstanceProvider = new CallManagerPassThruServiceInstanceProvider(this); m_callManagerPassThruSvcHost = new ServiceHost(typeof(CallManagerPassThruService)); m_callManagerPassThruSvcHost.Description.Behaviors.Add(callManagerPassThruSvcInstanceProvider); m_callManagerPassThruSvcHost.Open(); logger.Debug("SIPAppServerManager CallManagerPassThru hosted service successfully started on " + m_callManagerPassThruSvcHost.BaseAddresses[0].AbsoluteUri + "."); } catch (Exception excp) { logger.Warn("Exception starting SIPAppServerManager CallManagerPassThru hosted service. " + excp.Message); } foreach (XmlNode appServerWorkerNode in m_appServerWorkersNode.ChildNodes) { SIPAppServerWorker appServerWorker = new SIPAppServerWorker(appServerWorkerNode); if (m_sipCallDispatcherFile != null) { appServerWorker.Healthy += WorkerIsHealthy; appServerWorker.Unhealthy += WorkerIsUnhealthy; } m_appServerWorkers.Add(appServerWorker); m_workerSIPEndPoints.Add(appServerWorker.AppServerEndpoint.ToString()); logger.Debug("SIPAppServerManager worker added for " + appServerWorker.AppServerEndpoint.ToString() + " and " + appServerWorker.CallManagerAddress.ToString() + "."); } ThreadPool.QueueUserWorkItem(delegate { SpawnWorkers(); }); ThreadPool.QueueUserWorkItem(delegate { ProbeWorkers(); }); }