Files
2025-06-06 09:15:13 +02:00

206 lines
6.8 KiB
C#

using com.itac.mes.commonsmt;
using com.itac.mes.commonsmt.data;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace com.itac.mes.commonsmt
{
class FailoverHostList
{
// this list is cyclically updated as long as a mesService Endpoint is active and not closed
private List<FailoverHost> failoverHosts;
// this is the host all current calls are going to
private FailoverHost activeHost;
public event MyEventHandler OnLog;
public FailoverHostList(MyEventHandler log)
{
this.OnLog = log;
}
public void log(TraceEventType traceEventType, string message)
{
if (OnLog == null) { return; }
MyEventArgs myEventArgs = new MyEventArgs();
myEventArgs.message = "iTAC.MES.Suite SMT-Plugin:" + message;
myEventArgs.traceEventType = traceEventType;
OnLog(this, myEventArgs);
}
public void setFailover(FailoverHost[] newFailoverHosts)
{
// protocol all changes
Boolean newHosts = false;
if (newFailoverHosts == null)
{
activeHost = null;
this.failoverHosts = null;
return;
}
if (this.failoverHosts == null)
{
// initial setting
log(TraceEventType.Information, "setting initial failover hosts :");
foreach (FailoverHost item in newFailoverHosts)
{
log(TraceEventType.Information, ": " + item.getHostname());
}
}
else
{
// whats new, whats removed...
Dictionary<String, FailoverHost> currentHosts = new Dictionary<String, FailoverHost>();
foreach (FailoverHost item in this.failoverHosts)
{
currentHosts.Add(item.getHostname(), item);
}
foreach (FailoverHost item in newFailoverHosts)
{
if (currentHosts.ContainsKey(item.getHostname()))
{
// enthalten, also aus dieser Liste lösche
currentHosts.Remove(item.getHostname());
}
else
{
// bisher nicht enthalten, also neu
Console.Write("new failover host " + item.getHostname());
newHosts = true;
}
}
if (currentHosts.Count > 0)
{
log(TraceEventType.Information, "some failover host removed ");
foreach (FailoverHost removedHost in currentHosts.Values)
{
log(TraceEventType.Information, " - " + removedHost.getHostname());
}
}
else
{
if (!newHosts)
{
log(TraceEventType.Information, "failover host list remains unchanged ");
foreach (FailoverHost item in newFailoverHosts)
{
log(TraceEventType.Information, ":" + item.getHostname());
}
}
}
}
this.failoverHosts = newFailoverHosts.ToList();
// der erste Host in der Liste ist auch der Host, zu dem die aufrufe ohne Failover gehen!!!
if (activeHost == null)
{
if (newFailoverHosts.Length > 0)
{
activeHost = newFailoverHosts[0];
}
else
{
// clean default host
activeHost = null;
}
}
}
/**
* Removes a host from the failover list.
*
* If the host is the currently active host {@link #getActiveHost()} then the current host is set to null<br>
* If the host is not in the host list then nothing happens
*
* @param host
* the host to be removed; do nothing if host is null
*/
public void remove(FailoverHost host)
{
if (host == null)
{
return;
}
log(TraceEventType.Information, "remove host " + host.getHostname() + " from failover list");
for (int i = 0; i < getList().Count; i++)
{
FailoverHost item = getList()[i];
if (item.getHostname().Equals(host.getHostname()))
{
getList().Remove(item);
log(TraceEventType.Information, "host " + item.getHostname() + " removed from failover list");
}
}
if (activeHost != null && activeHost.getHostname().Equals(host.getHostname()))
{
setActiveHost(null);
}
}
/**
* @return the number of hosts in the failover list
*/
public int size()
{
return failoverHosts == null ? 0 : failoverHosts.Count;
}
/**
* @return the list of currently known host to fail over
*/
public List<FailoverHost> getList()
{
return failoverHosts == null ? new List<FailoverHost>() : failoverHosts;
}
public FailoverHost getActiveHost()
{
return activeHost;
}
public void setActiveHost(FailoverHost host)
{
if (host == null)
{
log(TraceEventType.Information, "clear active failover hosts");
}
else
{
log(TraceEventType.Information, "set " + host.getHostname() + " as active failover hosts");
}
this.activeHost = host;
}
public FailoverHost getNextFailoverHost()
{
FailoverHost failoverHost = null;
log(TraceEventType.Information, "scanning for other failover hosts. list contains a total of " + size() + " hosts");
foreach (FailoverHost host in getList())
{
if (host.Equals(getActiveHost()))
{
continue;
}
failoverHost = host;
log(TraceEventType.Information, "next failover hosts is " + host.getHostname());
break;
}
// den nächsten aus der Liste ohne den defaultHost
if (size() == 0)
{
log(TraceEventType.Information, "No more failover host available!");
}
return failoverHost;
}
}
}