/// <summary> /// 启动服务。 /// </summary> protected override void OnStart(string[] args) { try { this._eventLog.WriteEntry("MES.LotJob 服务启动"); if (lstWrapper == null) { lstWrapper = new List <LotJobTransferThreadWrapper>(); } //增加线程个数。 ParameterizedThreadStart threadStart = new ParameterizedThreadStart(Execute); LotJobTransferThreadWrapper wrapper = new LotJobTransferThreadWrapper(threadStart); lstWrapper.Add(wrapper); //启动线程。 foreach (LotJobTransferThreadWrapper item in lstWrapper) { Thread.Sleep(500); item.Start(); } } catch (Exception ex) { this._eventLog.WriteEntry(string.Format("MES.LotJob:{0}", ex.Message), EventLogEntryType.Error); } }
/// <summary> /// 执行批次作业。 /// </summary> private void Execute(object obj) { try { LotJobTransferThreadWrapper wrapper = obj as LotJobTransferThreadWrapper; if (wrapper == null) { return; } Execute(wrapper); } catch (Exception ex) { this._eventLog.WriteEntry("MES.LotJob: " + ex.Message); } }
/// <summary> /// 执行批次作业。 /// </summary> private void Execute(LotJobTransferThreadWrapper wrapper) { while (wrapper.Loop) { try { //查询前10个批次定时作业。 PagingConfig cfg = new PagingConfig() { PageNo = 0, PageSize = 10, Where = string.Format(@"Status=1 AND CloseType=0 AND NextRunTime<='{0}'" , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), OrderBy = "NextRunTime" }; IList <WIPModel.LotJob> lstJob = new List <WIPModel.LotJob>(); using (LotJobServiceClient client = new LotJobServiceClient()) { MethodReturnResult <IList <WIPModel.LotJob> > rst = client.Get(ref cfg); if (rst.Data == null) { this._eventLog.WriteEntry(string.Format("MES.LotJob:{0}", rst.Message), EventLogEntryType.Error); client.Close(); continue; } lstJob = rst.Data; } //遍历JOB数据 foreach (WIPModel.LotJob job in lstJob) { job.RunCount++; job.NotifyMessage = string.Empty; #region //自动出站。 if (job.Type == EnumJobType.AutoTrackOut) { TrackOutParameter p = new TrackOutParameter() { Creator = job.Creator, LineCode = job.LineCode, LotNumbers = new List <string>(), OperateComputer = System.Net.Dns.GetHostName(), Operator = job.Creator, RouteOperationName = job.RouteStepName, EquipmentCode = job.EquipmentCode }; p.LotNumbers.Add(job.LotNumber); using (LotTrackOutServiceClient client = new LotTrackOutServiceClient()) { MethodReturnResult result = client.TrackOut(p); if (result.Code > 0) { job.NotifyMessage = result.Message; job.NextRunTime = job.NextRunTime.AddMinutes(1); this._eventLog.WriteEntry(string.Format("MES.LotJob:{0} {1}" , job.LotNumber , job.Type.GetDisplayName() , result.Message), EventLogEntryType.Error); } else { job.CloseType = EnumCloseType.Normal; } } } #endregion #region //自动进站。 else if (job.Type == EnumJobType.AutoTrackIn) { TrackInParameter p = new TrackInParameter() { Creator = job.Creator, LineCode = job.LineCode, LotNumbers = new List <string>(), OperateComputer = System.Net.Dns.GetHostName(), Operator = job.Creator, RouteOperationName = job.RouteStepName, EquipmentCode = job.EquipmentCode }; p.LotNumbers.Add(job.LotNumber); using (LotTrackInServiceClient client = new LotTrackInServiceClient()) { MethodReturnResult result = client.TrackIn(p); if (result.Code > 0) { job.NotifyMessage = result.Message; job.NextRunTime = job.NextRunTime.AddMinutes(1); this._eventLog.WriteEntry(string.Format("MES.LotJob:{0} {1}" , job.LotNumber , job.Type.GetDisplayName() , result.Message), EventLogEntryType.Error); } else { job.CloseType = EnumCloseType.Normal; } } } #endregion //超过5次没有完成,则设置为手动关闭。定时作业失败。 if (job.RunCount >= 2 && job.CloseType == EnumCloseType.None) { job.CloseType = EnumCloseType.Manual; } #region //更新批次定时作业。 using (LotJobServiceClient client = new LotJobServiceClient()) { MethodReturnResult result = client.Modify(job); if (result.Code > 0) { this._eventLog.WriteEntry(string.Format("MES.LotJob:{0} {1}" , job.LotNumber , job.Type.GetDisplayName() , result.Message), EventLogEntryType.Error); } } #endregion } } catch (Exception ex) { this._eventLog.WriteEntry(string.Format("MES.LotJob:{0}", ex.Message), EventLogEntryType.Error); } if (wrapper.Loop) { Thread.Sleep(1000); } } wrapper.AutoResetEvent.Set(); }