8edc220f793a376ebc1934c9af81456e4c39b9ff.svn-base 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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 = null;
  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. get { return _htExternServer; }
  59. }
  60. private Hashtable _htDispatcher = new Hashtable();
  61. public Hashtable HtDispatcher
  62. {
  63. get { return _htDispatcher; }
  64. }
  65. private DataSet _dsServerList = new DataSet();
  66. #endregion
  67. public void InitServerMain(Object[] objs)
  68. {
  69. if (objs != null)
  70. {
  71. if (objs.GetLength(0) >= 1)
  72. {
  73. _serverConf = (ServerConfigure)(objs[0]);
  74. }
  75. }
  76. try
  77. {
  78. RemotingGate _rg = new RemotingGate(_serverConf);
  79. ShowLog("初始化数据库连接......");
  80. InitDBManager();
  81. ShowLog("数据库连接初始化完毕!");
  82. GetServerListDataSet();
  83. ShowLog("读取应用服务配置......");
  84. foreach (DataRow dr in this._dsServerList.Tables[0].Rows)
  85. {
  86. LoadAssemblyServer(dr["ServerName"].ToString(), dr["AssemblyName"].ToString(), dr["DBName"].ToString(), dr["Url"].ToString(), dr["Description"].ToString());
  87. }
  88. ShowLog("读取扩展服务器配置......");
  89. InitExternServer();
  90. }
  91. catch (SocketException sEx)
  92. {
  93. ShowLog("只能运行一个服务端!");
  94. if (sEx.ErrorCode == 10048)
  95. {
  96. long start_time = DateTime.Now.Ticks;
  97. int T_Count = 10;
  98. do
  99. {
  100. int vSec = (int)(T_Count - (DateTime.Now.Ticks - start_time) / 10000000);
  101. if (vSec != T_Count)
  102. {
  103. ShowLog(string.Format("退出倒计时:{0} 秒", vSec));
  104. T_Count = vSec;
  105. }
  106. Application.DoEvents();
  107. } while (DateTime.Now.Ticks - start_time <= T_Count * 10000000);
  108. Application.Exit();
  109. }
  110. }
  111. catch (Exception ex)
  112. {
  113. ShowLog(ex.Message);
  114. }
  115. }
  116. private void InitDBManager()
  117. {
  118. ShowLog(string.Format("读取配置文件: {0}", _serverConf.ConfigFilePath));
  119. string _strDB = _serverConf.MESDB;
  120. string[] strDBs = _strDB.Split('|');
  121. for (int i = 0; i < strDBs.Length; i++)
  122. {
  123. try
  124. {
  125. string str = strDBs[i];
  126. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "A"));
  127. DBManager dbm = new STMes.DBManager(str, "A");
  128. dbm.SetLogHandle(this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  129. dbm.IsLogging = this._isLogging;
  130. DBManagerList.Add(str, dbm);
  131. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "B"));
  132. dbm = new STMes.DBManager(str, "B");
  133. dbm.SetLogHandle(this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  134. dbm.IsLogging = this._isLogging;
  135. DBManagerList.Add(str + "B", dbm);
  136. ShowLog(string.Format("[{0}/{1}]初始化DBManager: {2} {3}", i + 1, strDBs.Length, str, "C"));
  137. dbm = new STMes.DBManager(str, "C");
  138. dbm.SetLogHandle(this._isLogging ? new DBManager.ShowLogDelegate(ShowLog) : null);
  139. dbm.IsLogging = this._isLogging;
  140. DBManagerList.Add(str + "C", dbm);
  141. }
  142. catch (Exception ex)
  143. {
  144. Console.WriteLine(ex.Message);
  145. }
  146. }
  147. }
  148. //获得服务端配置信息列表
  149. private DataTable GetServerConfigInfo()
  150. {
  151. return null;
  152. }
  153. //==========================================================
  154. // 加载应用服务
  155. //==========================================================
  156. private void LoadAssemblyServer(string ServiceName, string assName, string dbName, string ServiceURL, string ServiceDescrption)
  157. {
  158. try
  159. {
  160. string file = Path.Combine(Application.StartupPath, assName + ".dll");
  161. IServerPool obj = new IServerPool();
  162. obj.DBManagerList = DBManagerList;
  163. obj.ServerName = ServiceName;
  164. obj.AssemblyName = assName;
  165. obj.HTServiceKeys = this._htServiceKeys;
  166. obj.HtExtServer = this._htExternServer;
  167. obj.ServerConfig = this._serverConf;
  168. obj.OwnObjects = new ArrayList() { this };
  169. obj.LoadAllClass(file, dbName);
  170. string md5key;
  171. string sha256key;
  172. obj.GetFileKey(file, out md5key, out sha256key);
  173. if (HTServiceKeys.ContainsKey(ServiceName))
  174. {
  175. HTServiceKeys.Remove(ServiceName);
  176. }
  177. ServiceObject mso = new ServiceObject();
  178. mso.MD5_KEY = md5key;
  179. mso.SHA256_KEY = sha256key;
  180. mso.URL = ServiceURL;
  181. mso.Valid = ServiceObjectStatus.Normal;
  182. mso.Enable = true;
  183. mso.Description = ServiceDescrption;
  184. mso.DLL_FileName = assName + ".dll";
  185. HTServiceKeys.Add(ServiceName, mso);
  186. //== 以服务名键值,加入本地服务列表
  187. if (HtAssemblyService.ContainsKey(ServiceName))
  188. {
  189. IServerPool isp = (IServerPool)HtAssemblyService[ServiceName];
  190. isp.Dispose();
  191. HtAssemblyService.Remove(ServiceName);
  192. }
  193. HtAssemblyService.Add(ServiceName, obj);
  194. if (_htDispatcher.ContainsKey(ServiceName))
  195. {
  196. Dispatcher dp = (Dispatcher)(_htDispatcher[ServiceName]);
  197. RemotingServices.Disconnect(dp);
  198. dp.MemoryDispose();
  199. _htDispatcher.Remove(ServiceName);
  200. }
  201. //Dispatcher myDisp = new Dispatcher(obj, _serverConf, null);
  202. Dispatcher myDisp = new Dispatcher(obj, _serverConf, obj.OwnObjects);
  203. _htDispatcher.Add(ServiceName, myDisp);
  204. RemotingServices.Marshal(myDisp, ServiceName);
  205. this.ShowLog(" 加载" + ServiceName + "成功!");
  206. }
  207. catch (Exception ex)
  208. {
  209. this.ShowLog(" 加载" + ServiceName + "失败!\n" + ex.Message);
  210. throw ex;
  211. }
  212. }
  213. private void UnLoadAssemblyServer(string ServiceName)
  214. {
  215. try
  216. {
  217. if (_htDispatcher.ContainsKey(ServiceName))
  218. {
  219. Dispatcher dp = (Dispatcher)(_htDispatcher[ServiceName]);
  220. RemotingServices.Disconnect(dp);
  221. dp.MemoryDispose();
  222. _htDispatcher.Remove(ServiceName);
  223. }
  224. //== 以服务名键值,加入本地服务列表
  225. string AssemblyName = "";
  226. if (HtAssemblyService.ContainsKey(ServiceName))
  227. {
  228. IServerPool isp = (IServerPool)HtAssemblyService[ServiceName];
  229. AssemblyName = isp.AssemblyName;
  230. isp.Dispose();
  231. HtAssemblyService.Remove(ServiceName);
  232. }
  233. if (HTServiceKeys.ContainsKey(ServiceName))
  234. {
  235. HTServiceKeys.Remove(ServiceName);
  236. }
  237. this.ShowLog(" 卸载" + ServiceName + "成功!");
  238. }
  239. catch (Exception ex)
  240. {
  241. this.ShowLog(" 卸载" + ServiceName + "失败!\n" + ex.Message);
  242. throw ex;
  243. }
  244. }
  245. private void InitExternServer()
  246. {
  247. try
  248. {
  249. string[] exServers = _serverConf.ExtServers.Split(new string[] { "|", ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
  250. if (exServers.GetLength(0) == 0) return;
  251. foreach (string _serv in exServers)
  252. {
  253. bool same_server = false;
  254. string serv = _serv.Trim();
  255. UriBuilder ub = new UriBuilder(serv);
  256. System.Net.IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
  257. if (ips.Length > 0)
  258. {
  259. foreach (IPAddress cip in ips)
  260. {
  261. if (cip.AddressFamily == AddressFamily.InterNetwork)
  262. {
  263. string ip = cip.ToString().Trim();
  264. if (string.IsNullOrEmpty(ip) || ip.Length < 7 || ip.Length > 15) continue;
  265. if (ub.Host == ip)
  266. {
  267. same_server = true;
  268. break;
  269. }
  270. }
  271. }
  272. }
  273. if (same_server) continue;
  274. if (!_htExternServer.ContainsKey(serv))
  275. {
  276. UriBuilder ubr = new UriBuilder(serv);
  277. RemotingServer rs = new RemotingServer(serv, HTServiceKeys);
  278. rs.InitServiceUrlList("ServerCommon", serv);
  279. rs.InitServiceUrlList("ServerListener", string.Format("Tcp://{0}:{1}/ServerListener", ubr.Host, ubr.Port - 2));
  280. _htExternServer.Add(serv, rs);
  281. this.ShowLog(string.Format(" 获取扩展服务器 [{0}:{1}]资源!", ub.Host, ub.Port));
  282. rs.SetChangeEvent(_serverConf.ssc_event);
  283. rs.LoadExternServices();
  284. if (_serverConf.ssc_event != null) _serverConf.ssc_event();
  285. rs.CheckHeartBeat();
  286. }
  287. }
  288. }
  289. catch (Exception ex)
  290. {
  291. Debug.Print(ex.Message);
  292. }
  293. }
  294. public void SetServerFlag(string ServerName, bool Enable)
  295. {
  296. foreach (string FullServerName in this.HtExternServer.Keys)
  297. {
  298. UriBuilder ub = new UriBuilder(FullServerName);
  299. string sn = string.Format("{0}:{1}", ub.Host, ub.Port);
  300. if (ServerName == sn)
  301. {
  302. ((RemotingServer)(this.HtExternServer[FullServerName])).Enable = Enable;
  303. break;
  304. }
  305. }
  306. }
  307. public void SetServiceFlag(string ServerName, string ServiceName, bool Enable)
  308. {
  309. foreach (string FullServerName in this.HtExternServer.Keys)
  310. {
  311. UriBuilder ub = new UriBuilder(FullServerName);
  312. string sn = string.Format("{0}:{1}", ub.Host, ub.Port);
  313. Hashtable ht_srv = ((RemotingServer)(this.HtExternServer[FullServerName])).HTServices;
  314. if (ServerName == sn && ht_srv.ContainsKey(ServiceName))
  315. {
  316. ((ServiceObject)(ht_srv[ServiceName])).Enable = Enable;
  317. }
  318. }
  319. }
  320. private void GetServerListDataSet()
  321. {
  322. if (!File.Exists("MesServer.xml"))
  323. {
  324. throw new Exception("未找到服务配置文件!");
  325. }
  326. _dsServerList.ReadXml("MesServer.xml");
  327. if (_dsServerList == null || _dsServerList.Tables.Count == 0)
  328. throw new Exception("配置文件设置错误!");
  329. _dsServerList.AcceptChanges();
  330. }
  331. #region IDisposable 成员
  332. public void Dispose()
  333. {
  334. if (this.DBManagerList != null)
  335. {
  336. IEnumerator ie = this.DBManagerList.GetEnumerator();
  337. while (ie.MoveNext())
  338. {
  339. try
  340. {
  341. System.Collections.DictionaryEntry id = (System.Collections.DictionaryEntry)ie.Current;
  342. STMes.DBManager myDbManager = (STMes.DBManager)id.Value;
  343. myDbManager.Dispose();
  344. myDbManager = null;
  345. }
  346. catch { }
  347. }
  348. this.DBManagerList.Clear();
  349. }
  350. if (STMes.DBManager._dbProxy != null)
  351. {
  352. try
  353. {
  354. STMes.DBManager._dbProxy.Dispose();
  355. }
  356. catch { }
  357. }
  358. }
  359. #endregion
  360. }
  361. }