using System;
using System.IO;
using System.Xml;
using System.Data;
using System.Text;
using System.Collections;
using System.Reflection;
using System.Configuration;
using Core.Mes.IBaseInterface;
namespace Core.Mes.ServerFrameWork
{
public class Dispatcher : MarshalByRefObject, ICommon
{
#region " Construct "
public Dispatcher() { }
public Dispatcher(IServerPool pool)
{
Pool = pool;
Debug = System.Configuration.ConfigurationManager.AppSettings["Debug"].ToLower();
}
private IServerPool _pool = null;
public IServerPool Pool
{
get { return _pool; }
set { _pool = value; }
}
private string Debug = "false";
#endregion
#region " Variable "
//== 子服务集合
public static Hashtable _htServers = new Hashtable();
//== 数据链接集合
public static Hashtable htDBManager = new Hashtable();
public event GetStatusInfoHandler getStatusInfo;
public delegate void GetStatusInfoHandler(string info);
protected virtual void SetStatusMessage(string info)
{
if (getStatusInfo != null)
{
getStatusInfo(info);
}
}
#endregion
#region 内存释放
public void MemoryDispose()
{
int MemoryMaxSize = 100;
int.TryParse(System.Configuration.ConfigurationManager.AppSettings["MemoryMaxSize"], out MemoryMaxSize);
long memorysize = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
int PagedMemorySize = (int)memorysize / (1024 * 1024);
if (PagedMemorySize > MemoryMaxSize)//进程占用内存>100M 做GC.
{
try
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
}
catch
{
}
System.Diagnostics.Process.GetCurrentProcess().Dispose();
}
}
#endregion
#region MethodTimeLog
private static object lockObj = new object();
public void MethodTimeLog(TimeSpan tspan, object[] objs, object[] args)
{
string path = string.Format(@"./log/Method/MethodTimeLog_{0}.txt", System.DateTime.Now.ToString("yyyy_MM_dd"));
lock (lockObj)
{
using (StreamWriter sw = new StreamWriter(path, true, Encoding.UTF8))
{
StringBuilder sbtxt = new StringBuilder();
sbtxt.AppendLine("==============================================");
sbtxt.AppendLine(string.Format("LogWriteTime:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
sbtxt.AppendLine(string.Format("Time:{0}", tspan.TotalMilliseconds));
sbtxt.AppendLine(string.Format("ClassName:{0}", objs[0].ToString()));
sbtxt.AppendLine(string.Format("MethodName:{0}", objs[1].ToString()));
if (args != null)
{
foreach (object obj in args)
{
if (obj != null)
{
sbtxt.AppendLine(string.Format("Parameters:{0}", obj.ToString()));
}
}
}
sbtxt.AppendLine("==============================================");
sw.WriteLine(sbtxt.ToString());
}
}
}
public void MethodErrLog(Exception ex, object[] objs, object[] args)
{
string path = string.Format(@"./log/Method/MethodErrLog_{0}.txt", System.DateTime.Now.ToString("yyyy_MM_dd"));
lock (lockObj)
{
using (StreamWriter sw = new StreamWriter(path, true, Encoding.UTF8))
{
StringBuilder sbtxt = new StringBuilder();
sbtxt.AppendLine("==============================================");
sbtxt.AppendLine(string.Format("LogWriteTime:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
sbtxt.AppendLine(string.Format("ClassName:{0}", objs[0].ToString()));
sbtxt.AppendLine(string.Format("MethodName:{0}", objs[1].ToString()));
if (args != null)
{
foreach (object obj in args)
{
if (obj != null)
{
sbtxt.AppendLine(string.Format("Parameters:{0}", obj.ToString()));
}
}
}
sbtxt.AppendLine(ex.Message);
sbtxt.AppendLine(ex.StackTrace);
sbtxt.AppendLine("==============================================");
sw.WriteLine(sbtxt.ToString());
}
}
}
public void DebugLog(object[] objs, object[] args)
{
string path = string.Format(@"./log/Method/DebugLog_{0}.txt", System.DateTime.Now.ToString("yyyy_MM_dd"));
lock (lockObj)
{
if (File.Exists(Path.GetFullPath(path)))
{
FileInfo fileInfo = new FileInfo(Path.GetFullPath(path));
if (fileInfo.Length / (1024 * 1024) > 6)
{
File.Delete(path);
}
}
using (StreamWriter sw = new StreamWriter(path, true, Encoding.UTF8))
{
StringBuilder sbtxt = new StringBuilder();
sbtxt.AppendLine("==============================================");
sbtxt.AppendLine(string.Format("LogWriteTime:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
sbtxt.AppendLine(string.Format("ClassName:{0}", objs[0].ToString()));
sbtxt.AppendLine(string.Format("MethodName:{0}", objs[1].ToString()));
if (args != null)
{
foreach (object obj in args)
{
if (obj != null)
{
sbtxt.AppendLine(string.Format("Parameters:{0}", obj.ToString()));
}
}
}
sbtxt.AppendLine("==============================================");
sw.WriteLine(sbtxt.ToString());
}
}
}
#endregion
#region " 调用服务 "
///
/// 服务端公开给客户端的调用后台服务的方法
///
///
///
public ReturnObject MethodHandler(CallingMessage message, ValidateInfo validateInfo)
{
//step1:
MemoryDispose();
//step2:
string serverName = message.ServerName;
string assemblyName = message.AssemblyName;
string className = message.ClassName;
string methodName = message.MethodName;
object[] args = message.args;
ReturnObject rtnObj = new ReturnObject();
MethodInfo myMethod = null;
try
{
if (Pool.HtComponent.Contains(className))
{
myMethod = Pool.GetType().GetMethod("HandleMethod");
try
{
//rtnObj = Pool.HandleMethod(className, methodName, args);
DateTime startTime = DateTime.Now;
if (Debug == "true")
{
DebugLog(new object[] { className, methodName }, args);
}
rtnObj = (ReturnObject)myMethod.Invoke(Pool, new object[] { className, methodName, args });
DateTime endTime = DateTime.Now;
TimeSpan tspan = endTime - startTime;
int MethodTime = 30;
int.TryParse(System.Configuration.ConfigurationManager.AppSettings["MethodTime"], out MethodTime);
if (tspan.TotalMilliseconds > (MethodTime * 1000))
{
MethodTimeLog(tspan, new object[] { className, methodName }, args);
}
return rtnObj;
}
catch (Exception ex)
{
MethodErrLog(ex, new object[] { className, methodName }, args);
return new ReturnObject(null, ex.Message);
}
finally
{
//if (myMethod != null) myMethod = null;
try
{
if (rtnObj.RealObject != null)
{
rtnObj.RealObject = null;
}
if (rtnObj.RealDataSet != null)
{
rtnObj.RealDataSet = null;
}
}
catch { }
}
}
else
{
return new ReturnObject(null, "未找到请求的服务!");
}
}
catch (Exception ex)
{
return new ReturnObject(null, "服务调用发生异常! \n" + ex.Message);
}
}
#endregion
#region " Common Handler "
//=======================================================
// 用来确保当创建 Singleton 时, 第一个实例永远不会过期
//=======================================================
public override object InitializeLifetimeService()
{
return null;
}
#endregion
}
}