Code Snippet
public
class V2Status {
private DateTime LastEmailTimeStamp;
private Timer StatusTimer;
private int ErrorCounter;
private DataTable MainTempStatus;
private DataTable MachineTempStatus;
private DataTable GenericTempStatus;
private DataSet Status;
private DataTable MainStatus;
private DataTable MachineStatus;
private DataTable GenericStatus;
public V2Status() {
ErrorCounter = 0;
InitializeTables();
}
public void Start() {
Execute();
StatusTimer =
new Timer();
StatusTimer.Interval = 5000;
StatusTimer.AutoReset =
true;
StatusTimer.Elapsed +=
new ElapsedEventHandler(TimerElapsed);
StatusTimer.Start();
}
public void Stop() {
StatusTimer.Stop();
StatusTimer.Dispose();
}
private void TimerElapsed(object sender, ElapsedEventArgs e) {
lock (this) {
Execute();
}
}
private void Execute() {
try {
if (Program.config.V2Status) {
if (Status == null) {
this.Status = new DataSet();
}
else {
Status.Reset();
}
RefreshStatus();
CheckDataManager();
Status.Tables.Add(
this.MainStatus);
Status.Tables.Add(
this.MachineStatus);
Program.V2ops.RefreshStatus(this.Status);
}
}
catch (Exception ex) {
Program.log.Add("Error refreshing V2 Status", ex);
}
}
private void CheckDataManager() {
try {
GenericStatus Status = Job_CORBA_Link.ORB.DataStatus();
this.MainTempStatus.Rows.Add("Datamanager Online");
}
catch (Exception ex) {
Program.log.Add("Error refreshing datamanager status.", ex);
this.MainTempStatus.Rows.Add("Datamanager Offline");
}
finally {
this.MainStatus.Clear();
this.MainStatus = MainTempStatus.Copy();
this.MainTempStatus.Dispose();
}
}
public void RefreshStatus() {
try {
this.MachineTempStatus = MachineStatus.Clone();
this.MainTempStatus = MainStatus.Clone();
ProcessStatus Status = Job_CORBA_Link.ORB.V2Status();
FactoryStatus[] FactoryStatusList = Status.mFactoryStatusList;
MachineStatus mStatus = new MachineStatus();
mStatus.CreateStructure(FactoryStatusList);
foreach (MachinePanelData m in mStatus.MachineData) {
this.AddMachineStatusRow(m.mIPAddress, m.mFactoryCount, m.mEngineCount, m.mMemReserve, m.mMemFree, m.mTotalMemory, m.mCPU);
}
ErrorCounter = 0;
this.MainTempStatus.Rows.Add("Supervisor Online");
}
catch (Exception ex) {
Program.log.Add("Error Refreshing Status.", ex);
this.MainTempStatus.Rows.Add("Supervisor Offline");
if ((ErrorCounter == 5) && (LastEmailTimeStamp.TimeOfDay <= (DateTime.Now.TimeOfDay - new TimeSpan(1, 0, 0)))) {
ErrorCounter = 0;
LastEmailTimeStamp = DateTime.Now;
Email e = new Email();
e.SendEMail(Program.config.Email_SMTPHost, Program.config.Email_V2OpsErrorEmailFrom,
Program.config.Email_V2OpsErrorReplyTo, "CRITICAL ERROR",
@"Error communicating with V2. Is the supervisor running?" +
Environment.NewLine +
"Error Message Reported: " + ex.Message,
true, e.SplitString(Program.config.Email_V2OpsErrorTo));
}
if (ErrorCounter > 5) {
ErrorCounter = 0;
}
else {
ErrorCounter = ErrorCounter + 1;
}
}
finally {
this.MachineStatus.Clear();
this.MachineStatus = MachineTempStatus.Copy();
this.MachineTempStatus.Dispose();
}
}
private void AddMachineStatusRow(string IPAddress, int FactoryCount, int EngineCount, int MemReserve, int MemFree, int TotalMemory, int CPU) {
MachineTempStatus.Rows.Add(IPAddress, FactoryCount, EngineCount, MemReserve, MemFree, TotalMemory, CPU);
}
private void InitializeTables() {
MainStatus =
new DataTable("MainStatus");
MainStatus.Columns.Add(
"Status");
MachineStatus =
new DataTable("MachineStatus");
MachineStatus.Columns.Add(
"IPAddress");
MachineStatus.Columns.Add(
"Factories");
MachineStatus.Columns.Add(
"Engines");
MachineStatus.Columns.Add(
"Memory Reserved");
MachineStatus.Columns.Add(
"Memory Free");
MachineStatus.Columns.Add(
"Total Memory");
MachineStatus.Columns.Add(
"CPU Usage");
}
}