34b6e7e50df1338f6d40a24fd39d8f2b4167738d.svn-base 15 KB

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