cefd44359c953f40c8471b555e2e99e2c13c4ddc.svn-base 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. using System;
  2. using System.IO;
  3. using System.Data;
  4. using System.Reflection;
  5. using System.Collections;
  6. using System.Runtime.Remoting;
  7. using System.Runtime.Remoting.Channels;
  8. using System.Windows.Forms;
  9. using STMes;
  10. using Core.Mes.ServerFrameWork;
  11. using System.Configuration;
  12. using System.Net.Sockets;
  13. using System.Collections.Specialized;
  14. using System.Net;
  15. using Core.Mes.IBaseInterface;
  16. using System.Diagnostics;
  17. namespace Core.Mes.ServerManager
  18. {
  19. /// <summary>
  20. /// ClsServerMain 的摘要说明。
  21. /// </summary>
  22. public class ClsServerMain : IDisposable
  23. {
  24. public bool _isLogging = false;
  25. private CoreWriteLogFile cwl_sql = new CoreWriteLogFile("SQL");
  26. private ServerConfigure _serverConf;
  27. public ClsServerMain() { }
  28. public delegate void ShowLogDelegate(string log);
  29. public event ShowLogDelegate ShowLogEvent;
  30. private void ShowLog(string log)
  31. {
  32. if (ShowLogEvent != null)
  33. {
  34. ShowLogEvent(log);
  35. }
  36. }
  37. #region " Property "
  38. private Hashtable _dbManagerList = new Hashtable();
  39. public Hashtable DBManagerList
  40. {
  41. //set { _dbManagerList = value; }
  42. get { return _dbManagerList; }
  43. }
  44. private Hashtable _htAssemblyService = new Hashtable();
  45. public Hashtable HtAssemblyService
  46. {
  47. //set { _htAssemblyServer = value; }
  48. get { return _htAssemblyService; }
  49. }
  50. private Hashtable _htServiceKeys = new Hashtable();
  51. public Hashtable HTServiceKeys
  52. {
  53. get { return _htServiceKeys; }
  54. }
  55. private Hashtable _htExternServer = new Hashtable();
  56. public Hashtable HtExternServer
  57. {
  58. //set { _htExternServer = value; }
  59. get { return _htExternServer; }
  60. }
  61. private DataSet _dsServerList = new DataSet();
  62. #endregion
  63. public void InitServerMain(Object[] objs)
  64. {
  65. if (objs != null)
  66. {
  67. if (objs.GetLength(0) >= 1)
  68. {
  69. _serverConf = (ServerConfigure)(objs[0]);
  70. }
  71. }
  72. try
  73. {
  74. RemotingGate _rg = new RemotingGate(_serverConf);
  75. ShowLog("初始化数据库连接......");
  76. InitDBManager();
  77. ShowLog("数据库连接初始化完毕!");
  78. GetServerListDataSet();
  79. ShowLog("读取应用服务配置......");
  80. foreach (DataRow dr in this._dsServerList.Tables[0].Rows)
  81. {
  82. LoadAssemblyServer(dr["ServerName"].ToString(), dr["AssemblyName"].ToString(), dr["DBName"].ToString(), dr["Url"].ToString(), dr["Description"].ToString());
  83. }
  84. ShowLog("读取扩展服务器配置......");
  85. InitExternServer();
  86. }
  87. catch (SocketException sEx)
  88. {
  89. ShowLog("只能运行一个服务端!");
  90. if (sEx.ErrorCode == 10048)
  91. {
  92. long start_time = DateTime.Now.Ticks;
  93. int T_Count = 10;
  94. do
  95. {
  96. int vSec = (int)(T_Count - (DateTime.Now.Ticks - start_time) / 10000000);
  97. if (vSec != T_Count)
  98. {
  99. ShowLog(string.Format("退出倒计时:{0} 秒", vSec));
  100. T_Count = vSec;
  101. }
  102. Application.DoEvents();
  103. } while (DateTime.Now.Ticks - start_time <= T_Count * 10000000);
  104. Application.Exit();
  105. }
  106. }
  107. catch (Exception ex)
  108. {
  109. ShowLog(ex.Message);
  110. }
  111. }
  112. private void InitDBManager()
  113. {
  114. ShowLog(string.Format("读取配置文件: {0}", _serverConf.ConfigFilePath));
  115. string _strDB = _serverConf.MESDB;
  116. string[] strDBs = _strDB.Split('|');
  117. for (int i = 0; i < strDBs.Length; i++)
  118. {
  119. try
  120. {
  121. string str = strDBs[i];
  122. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "A"));
  123. DBManager dbm = new STMes.DBManager(str, "A", this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  124. dbm.IsLogging = this._isLogging;
  125. DBManagerList.Add(str, dbm);
  126. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "B"));
  127. dbm = new STMes.DBManager(str, "B", this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  128. dbm.IsLogging = this._isLogging;
  129. DBManagerList.Add(str + "B", dbm);
  130. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "C"));
  131. dbm = new STMes.DBManager(str, "C", this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  132. dbm.IsLogging = this._isLogging;
  133. DBManagerList.Add(str + "C", dbm);
  134. }
  135. catch (Exception ex)
  136. {
  137. Console.WriteLine(ex.Message);
  138. }
  139. }
  140. }
  141. //获得服务端配置信息列表
  142. private DataTable GetServerConfigInfo()
  143. {
  144. return null;
  145. }
  146. //==========================================================
  147. // 加载应用服务
  148. //==========================================================
  149. private void LoadAssemblyServer(string ServiceName, string assName, string dbName, string ServiceURL, string ServiceDescrption)
  150. {
  151. try
  152. {
  153. Assembly assembly = Assembly.Load(assName);
  154. string file = Path.Combine(Application.StartupPath, assName + ".dll");
  155. IServerPool obj = new IServerPool();
  156. obj.DBManagerList = DBManagerList;
  157. obj.ServerName = ServiceName;
  158. obj.AssemblyName = assName;
  159. obj.HTServiceKeys = this._htServiceKeys;
  160. obj.HtExtServer = this._htExternServer;
  161. obj.ServerConfig = this._serverConf;
  162. foreach (Type type in assembly.GetTypes())
  163. {
  164. if (type.IsClass && type.IsSubclassOf(typeof(IComponent)))
  165. {
  166. obj.LoadClass(type, dbName);
  167. }
  168. }
  169. string md5key;
  170. string sha256key;
  171. obj.GetFileKey(file, out md5key, out sha256key);
  172. if (!HTServiceKeys.ContainsKey(ServiceName))
  173. {
  174. HTServiceKeys.Add(ServiceName, new ArrayList() { md5key, sha256key, ServiceURL, ServiceDescrption });
  175. }
  176. //== 以服务名键值,加入本地服务列表
  177. HtAssemblyService.Add(ServiceName, obj);
  178. Dispatcher myDisp = new Dispatcher(obj, _serverConf);
  179. RemotingServices.Marshal(myDisp, ServiceName);
  180. this.ShowLog("加载" + ServiceName + "成功!");
  181. }
  182. catch (Exception ex)
  183. {
  184. this.ShowLog("加载" + ServiceName + "失败!\n" + ex.Message);
  185. throw ex;
  186. }
  187. }
  188. private void InitExternServer()
  189. {
  190. try
  191. {
  192. string[] exServers = _serverConf.ExtServers.Split(new string[] { "|", ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
  193. if (exServers.GetLength(0) == 0) return;
  194. foreach (string _serv in exServers)
  195. {
  196. bool same_server = false;
  197. string serv = _serv.Trim();
  198. UriBuilder ub = new UriBuilder(serv);
  199. System.Net.IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
  200. if (ips.Length > 0)
  201. {
  202. foreach (IPAddress cip in ips)
  203. {
  204. if (cip.AddressFamily == AddressFamily.InterNetwork)
  205. {
  206. string ip = cip.ToString().Trim();
  207. if (string.IsNullOrEmpty(ip) || ip.Length < 7 || ip.Length > 15) continue;
  208. if (ub.Host == ip)
  209. {
  210. same_server = true;
  211. break;
  212. }
  213. }
  214. }
  215. }
  216. if (same_server) continue;
  217. if (!_htExternServer.ContainsKey(serv))
  218. {
  219. RemotingServer rs = new RemotingServer(serv, HTServiceKeys);
  220. rs.InitServiceUrlList("ServerCommon", serv);
  221. _htExternServer.Add(serv, rs);
  222. this.ShowLog(string.Format(" 获取扩展服务器 [{0}:{1}]资源!", ub.Host, ub.Port));
  223. rs.SetChangeEvent(_serverConf.ssc_event);
  224. rs.LoadExternServices();
  225. if (_serverConf.ssc_event != null) _serverConf.ssc_event();
  226. rs.CheckHeartBeat();
  227. }
  228. }
  229. }
  230. catch (Exception ex)
  231. {
  232. Debug.Print(ex.Message);
  233. }
  234. }
  235. public void SetServerFlag(string ServerName, bool Enable)
  236. {
  237. foreach (string FullServerName in this.HtExternServer.Keys)
  238. {
  239. UriBuilder ub = new UriBuilder(FullServerName);
  240. string sn = string.Format("{0}:{1}", ub.Host, ub.Port);
  241. if (ServerName == sn)
  242. {
  243. ((RemotingServer)(this.HtExternServer[FullServerName])).Enable = Enable;
  244. break;
  245. }
  246. //foreach (ServiceObject so in ((RemotingServer)(this.HtExternServer[ServerName])).HTServices)
  247. //{
  248. // so.Enable = Enable ? ServiceObjectStatus.Normal : ServiceObjectStatus.PauseService;
  249. //}
  250. }
  251. }
  252. public void SetServiceFlag(string ServerName, string ServiceName, bool Enable)
  253. {
  254. foreach (string FullServerName in this.HtExternServer.Keys)
  255. {
  256. UriBuilder ub = new UriBuilder(FullServerName);
  257. string sn = string.Format("{0}:{1}", ub.Host, ub.Port);
  258. Hashtable ht_srv = ((RemotingServer)(this.HtExternServer[FullServerName])).HTServices;
  259. if (ServerName == sn && ht_srv.ContainsKey(ServiceName))
  260. {
  261. ((ServiceObject)(ht_srv[ServiceName])).Enable = Enable;
  262. }
  263. }
  264. }
  265. private void GetServerListDataSet()
  266. {
  267. if (!File.Exists("MesServer.xml"))
  268. {
  269. throw new Exception("未找到服务配置文件!");
  270. }
  271. _dsServerList.ReadXml("MesServer.xml");
  272. if (_dsServerList == null || _dsServerList.Tables.Count == 0)
  273. throw new Exception("配置文件设置错误!");
  274. _dsServerList.AcceptChanges();
  275. }
  276. #region IDisposable 成员
  277. public void Dispose()
  278. {
  279. if (this.DBManagerList != null)
  280. {
  281. IEnumerator ie = this.DBManagerList.GetEnumerator();
  282. while (ie.MoveNext())
  283. {
  284. try
  285. {
  286. System.Collections.DictionaryEntry id = (System.Collections.DictionaryEntry)ie.Current;
  287. STMes.DBManager myDbManager = (STMes.DBManager)id.Value;
  288. myDbManager.Dispose();
  289. myDbManager = null;
  290. }
  291. catch { }
  292. }
  293. this.DBManagerList.Clear();
  294. }
  295. if (STMes.DBManager._dbProxy != null)
  296. {
  297. try
  298. {
  299. STMes.DBManager._dbProxy.Dispose();
  300. }
  301. catch { }
  302. }
  303. }
  304. #endregion
  305. }
  306. }