/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.ServiceProcess;
using System.Threading;
using log4net.Core;
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
namespace Lucene.Net.Distributed.Operations
{
///
/// A Windows service that provides system ping checking against LuceneServer.
///
public class LuceneMonitor : System.ServiceProcess.ServiceBase
{
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
private ServiceController scMonitor = new ServiceController();
private Thread serviceThread;
private int sleepTime = 5000;
private bool bRun = true;
private string ipAddress = "";
private int port = 0;
private static readonly log4net.ILog oLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public LuceneMonitor()
{
// This call is required by the Windows.Forms Component Designer.
InitializeComponent();
// TODO: Add any initialization after the InitComponent call
}
// The main entry point for the process
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new LuceneMonitor() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "LuceneMonitor";
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
///
/// Set things in motion so your service can do its work.
///
protected override void OnStart(string[] args)
{
ThreadStart threadStart = new ThreadStart(MonitorService);
serviceThread = new Thread(threadStart);
serviceThread.Start();
}
private void LogMessage(string message)
{
this.LogMessage(message, Level.Info);
}
private void LogMessage(string message, Level msgLevel)
{
if (msgLevel==Level.Info)
{
if (oLog.IsInfoEnabled)
oLog.Info(message);
}
else if (msgLevel==Level.Warn)
{
if (oLog.IsWarnEnabled)
oLog.Warn(message);
}
}
private void LogMessage(string message, Level msgLevel, int ErrorLevel)
{
if (msgLevel==Level.Error)
{
if (oLog.IsErrorEnabled)
{
oLog.Error(message);
EventLog.WriteEntry(this.ServiceName, message, EventLogEntryType.Error, ErrorLevel);
}
}
}
private void MonitorService()
{
this.LogMessage(this.ServiceName+" started");
scMonitor.ServiceName="LuceneServer";
this.sleepTime = (ConfigurationManager.AppSettings["ServiceSleepTime"] != null ? Convert.ToInt32(ConfigurationManager.AppSettings["ServiceSleepTime"]) : this.sleepTime);
this.ipAddress = (ConfigurationManager.AppSettings["IPAddress"] != null ? ConfigurationManager.AppSettings["IPAddress"] : "");
this.port = (ConfigurationManager.AppSettings["Port"] != null ? Convert.ToInt32(ConfigurationManager.AppSettings["Port"]) : 0);
this.LogMessage("ServiceSleepTime = "+this.sleepTime.ToString()+"; ipAddress="+this.ipAddress+"; port="+this.port.ToString());
while (bRun)
{
this.CheckService();
Thread.Sleep(sleepTime);
}
}
private void CheckService()
{
try
{
scMonitor.Refresh();
if (scMonitor.Status.Equals(ServiceControllerStatus.StopPending))
scMonitor.WaitForStatus(ServiceControllerStatus.Stopped);
if (scMonitor.Status.Equals(ServiceControllerStatus.Stopped))
{
// Start the service if the current status is stopped.
foreach (IChannel ic in ChannelServices.RegisteredChannels)
ChannelServices.UnregisterChannel(ic);
scMonitor.Start();
this.LogMessage(scMonitor.ServiceName + " started (Service stopped or StopPending)", Level.Error, 99);
}
}
catch (Exception e)
{
this.LogMessage(scMonitor.ServiceName + " error: "+e.Message+e.StackTrace, Level.Error, 199);
}
}
///
/// Stop this service.
///
protected override void OnStop()
{
this.bRun=false;
}
}
}