/// <summary> /// override Dispose . /// </summary> /// <param name="disposing"></param> protected override void Dispose(bool disposing) { Logger.Trace("WaitOne - before waitone"); _pool.WaitOne(); Logger.Trace("WaitOne - after waitone"); if (disposing) { TransactionScopeManager.UnregisterResource(this); if (IsTransactionActive()) { Logger.Trace("Dispose - _shouldClose = true"); _shouldClose = true; } else { if (!_disposed) { Logger.Trace("Dispose - base.Dispose(true)"); _disposed = true; base.Dispose(true); } else { Logger.Trace("Dispose - already disposed"); } } } Logger.Trace("Release - before release"); _pool.Release(); Logger.Trace("Release - after release"); }
/// <summary> /// Logic launched after the step. Will launch the postprocessor. /// @see IStepExecutionListener#AfterStep /// </summary> /// <param name="stepExecution"></param> /// <returns></returns> public virtual ExitStatus AfterStep(StepExecution stepExecution) { ExitStatus returnStatus = stepExecution.ExitStatus; if (!"FAILED".Equals(returnStatus.ExitCode)) { MethodInfo post = this.GetType().GetMethod("Postprocess", BindingFlags.Instance | BindingFlags.NonPublic); if (post.DeclaringType != typeof(AbstractExecutionListener)) { using (var scope = TransactionScopeManager.CreateScope()) { try { returnStatus = Postprocess(); } catch (Exception e) { // Need to catch exception to log and set status to FAILED, while // Spring batch would only log and keep the status COMPLETED Logger.Error(e, "Exception during postprocessor"); stepExecution.UpgradeStatus(BatchStatus.Failed); throw; } scope.Complete(); } } } return(returnStatus); }
public void FlatFileTestTransactionalTest() { var writer = new FlatFileItemWriter <Person> { Resource = new FileSystemResource(_testPath2), LineAggregator = new LineAggregator(), HeaderWriter = new HeaderWriter() }; var reader = new FlatFileItemReader <Person> { Resource = new FileSystemResource(_testPath2), LinesToSkip = 2, LineMapper = new LineMapper() }; var executionContext = new ExecutionContext(); writer.Open(executionContext); try { for (int i = 0; i < CountTransactions; i++) { using (TransactionScope scope = TransactionScopeManager.CreateScope()) { writer.Write(GetPersons(i)); if (i == CountTransactions - 1) //SIMULATE FAILURE { throw new Exception("Bailing out ... should rollback ..."); } scope.Complete(); } } } catch (Exception e) { Logger.Error(e, "An unexpected exception occured :"); } writer.Close(); var persons = new List <Person>(); reader.Open(executionContext); Person person; while ((person = reader.Read()) != null) { persons.Add(person); } reader.Close(); Assert.AreEqual((CountTransactions - 1) * CountObjects, persons.Count); for (var i = 0; i < persons.Count; i++) { Assert.AreEqual(i % CountObjects, persons[i].Id); Assert.IsTrue(persons[i].Name.StartsWith("Person" + i % CountObjects)); } }
/// <summary> /// override Dispose . /// </summary> /// <param name="disposing"></param> protected override void Dispose(bool disposing) { if (disposing) { TransactionScopeManager.UnregisterResource(this); if (IsTransactionActive()) { _shouldClose = true; } else { base.Dispose(true); } } }
/// <summary> /// Actual taskletstep execution. /// </summary> /// <param name="stepExecution"></param> /// <exception cref="Exception"> </exception> protected override void DoExecute(StepExecution stepExecution) { stepExecution.ExecutionContext.Put(TaskletTypeKey, _tasklet.GetType().Name); stepExecution.ExecutionContext.Put(StepConstants.StepTypeKey, GetType().Name); _stream.Update(stepExecution.ExecutionContext); JobRepository.UpdateExecutionContext(stepExecution); JobRepository.UpdateExecutionContext(stepExecution.JobExecution); // Shared semaphore per step execution, so other step executions can run // in parallel without needing the lock Semaphore semaphore = CreateSemaphore(); _stepOperations.Iterate(StepContextRepeatCallback.GetRepeatCallback(stepExecution, (context, chunkContext) => { StepExecution lStepExecution = chunkContext.StepContext.StepExecution; _interruptionPolicy.CheckInterrupted(lStepExecution); ChunkTransactionCallback callback = new ChunkTransactionCallback(chunkContext, semaphore, this); RepeatStatus result; using (var scope = TransactionScopeManager.CreateScope()) { TransactionScopeManager.RegisterTransactionSynchronization(scope, callback); try { result = callback.DoInTransaction(); } catch (Exception e) { //Log and rethrow Logger.Error(e, "Transaction will be rollbacked because of an unexpected exception."); throw; // throw to ensure rollback will occur (no complete) } scope.Complete(); } // Release connections since the transaction has ended ConnectionUtil.ReleaseConnections(); Thread.Sleep(stepExecution.DelayConfig); _interruptionPolicy.CheckInterrupted(stepExecution); return(result); } )); }
//任务输送到某一位置后,通知更新状态。【入库口任务到位,密集存储道穿过到位】 public override void Execute() { int[] data = null; try { string positionName = string.Empty; int taskID = 0; object state = AutomationContext.Read(memoryServiceName, memoryItemName); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { positionName = arrayObj.GetValue(0).ToString(); taskID = Convert.ToInt32(arrayObj.GetValue(1)); } } if (positionName == string.Empty || positionName == "0" || taskID == 0) return; data = new int[] { Convert.ToInt32(positionName), taskID }; using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { positionDal.TransactionScopeManager = TM; taskDal.TransactionScopeManager = TM; int positionID = positionDal.GetPositionIDByPositionName(positionName); int currentPositionID = taskDal.GetCurrentPositionID(taskID); int nextPositionID = taskDal.GetNextPositionID(taskID); int endPositionID = taskDal.GetEndPositionID(taskID); if (positionID != 0 && currentPositionID != endPositionID && positionID == nextPositionID) { positionDal.UpdateHasGoodsToTrue(positionID); taskDal.UpdateTaskPosition(taskID, positionID); taskDal.UpdateTaskPositionStateToArrived(taskID); if (positionID == endPositionID) { string orderType = taskDal.GetOrderType(taskID); if (orderType == "03")//出库单 { if (!AutomationContext.Write(memoryServiceName1, memoryItemName1, new int[] { taskID, positionID })) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } else if (orderType == "04")//盘点单 { if (!AutomationContext.Write(memoryServiceName1, memoryItemName2, new int[] { taskID, positionID })) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } else { if (!AutomationContext.Write(memoryServiceName, memoryItemName3, taskID)) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } } TM.Commit(); } else { Logger.Error(string.Format("{0} 处理[{1}]任务到达失败,到达位置{2}与任务不符!", Name, taskID,positionName)); } } } catch (Exception ex) { if (data != null) { AutomationContext.Write(memoryServiceName, memoryItemName, data); } Logger.Error("TaskArriveDataProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
//任务输送到某一位置后,通知更新状态。【入库口任务到位,密集存储道穿过到位】 public override void Execute() { int[] data = null; try { string positionName = string.Empty; int taskID = 0; object state = AutomationContext.Read(memoryServiceName, memoryItemName); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { positionName = arrayObj.GetValue(0).ToString(); taskID = Convert.ToInt32(arrayObj.GetValue(1)); } } if (positionName == string.Empty || positionName == "0" || taskID == 0) { return; } data = new int[] { Convert.ToInt32(positionName), taskID }; using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { positionDal.TransactionScopeManager = TM; taskDal.TransactionScopeManager = TM; int positionID = positionDal.GetPositionIDByPositionName(positionName); int currentPositionID = taskDal.GetCurrentPositionID(taskID); int nextPositionID = taskDal.GetNextPositionID(taskID); int endPositionID = taskDal.GetEndPositionID(taskID); if (positionID != 0 && currentPositionID != endPositionID && positionID == nextPositionID) { positionDal.UpdateHasGoodsToTrue(positionID); taskDal.UpdateTaskPosition(taskID, positionID); taskDal.UpdateTaskPositionStateToArrived(taskID); if (positionID == endPositionID) { string orderType = taskDal.GetOrderType(taskID); if (orderType == "03")//出库单 { if (!AutomationContext.Write(memoryServiceName1, memoryItemName1, new int[] { taskID, positionID })) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } else if (orderType == "04")//盘点单 { if (!AutomationContext.Write(memoryServiceName1, memoryItemName2, new int[] { taskID, positionID })) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } else { if (!AutomationContext.Write(memoryServiceName, memoryItemName3, taskID)) { AutomationContext.Write(memoryServiceName, memoryItemName, data); Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID)); return; } } } TM.Commit(); } else { Logger.Error(string.Format("{0} 处理[{1}]任务到达失败,到达位置{2}与任务不符!", Name, taskID, positionName)); } } } catch (Exception ex) { if (data != null) { AutomationContext.Write(memoryServiceName, memoryItemName, data); } Logger.Error("TaskArriveDataProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
private void DownloadData() { try { using (TransactionScopeManager TM = new TransactionScopeManager()) { OrderDal orderDal = new OrderDal(); orderDal.TransactionScopeManager = TM; if (orderDal.FindUnsortCount() == true) if (DialogResult.Cancel == MessageBox.Show("还有未分拣的数据,您确定要重新下载数据吗?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)) return; ChannelDal channelDal = new ChannelDal(); ServerDal serverDal = new ServerDal(); DataTable table = serverDal.FindBatch(); if (table.Rows.Count != 0) { string batchsortid = table.Rows[0]["batch_no"].ToString(); orderDal.DeleteExportData();//删除贴标机数据(未实现删除哪些表) //AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data); //下载烟道表 table = serverDal.FindChannel(batchsortid); channelDal.InsertChannel(table); System.Threading.Thread.Sleep(100); //下载订单主表 table = serverDal.FindOrderMaster(batchsortid); orderDal.InsertMaster(table); System.Threading.Thread.Sleep(100); //下载订单明细表 table = serverDal.FindOrderDetail(batchsortid); orderDal.InsertOrderDetail(table); //下载手工补货订单明细表 table = serverDal.FindHandleSupply(batchsortid); orderDal.InsertHandleSupply(table); //更新批次状态(下载完成) serverDal.UpdateBatchStatus(batchsortid); MessageBox.Show("数据下载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //Context.ProcessDispatcher.WriteToProcess("LEDProcess", "NewData", null); //Context.ProcessDispatcher.WriteToProcess("CreatePackAndPrintDataProcess", "NewData", null); //Context.ProcessDispatcher.WriteToProcess("CurrentOrderProcess", "CurrentOrderA", new int[] { -1 }); //Context.ProcessDispatcher.WriteToProcess("monitorView", "ProgressState", new ProgressState()); } else MessageBox.Show("没有需要分拣的订单数据。", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception e) { Logger.Error("下载数据失败!原因:" + e.Message); } }
/// <summary> /// Logic launched after the step. Will launch the postprocessor. /// @see IStepExecutionListener#AfterStep /// </summary> /// <param name="stepExecution"></param> /// <returns></returns> public virtual ExitStatus AfterStep(StepExecution stepExecution) { ExitStatus returnStatus = stepExecution.ExitStatus; if (!"FAILED".Equals(returnStatus.ExitCode)) { MethodInfo post = GetType().GetMethod("Postprocess", BindingFlags.Instance | BindingFlags.NonPublic); // determine worker / master mode for step if (stepExecution.remoteChunking != null) { TimeSpan RemoteChunkingTimoutSecond = stepExecution.remoteChunking.RemoteChunkingTimoutSecond; // master part if (stepExecution.remoteChunking._master) { // wait for Master method send back signal if (!stepExecution.remoteChunking.threadWait.WaitOne(-1)) { Exception e = new JobExecutionException("Master step failed"); Logger.Error(e, "Clean message in the Queue."); throw e; } // some worker failed master need to fail if ("FAILED".Equals(stepExecution.ExitStatus.ExitCode)) { Exception e = new JobExecutionException("Master step failed"); Logger.Error(e, "Clean message in the Queue."); throw e; } // clean all message queues when master completed Logger.Info("Master is completed."); Logger.Info("Clean message in the Queue."); stepExecution.remoteChunking.CleanAllQueue(); } else { if (!stepExecution.remoteChunking.threadWait.WaitOne(-1)) { returnStatus = stepExecution.ExitStatus; throw new JobExecutionException("Worker step failed"); } Logger.Info("Worker is completed."); } } if (post.DeclaringType != typeof(AbstractExecutionListener)) { using (var scope = TransactionScopeManager.CreateScope()) { try { returnStatus = Postprocess(); } catch (Exception e) { // Need to catch exception to log and set status to FAILED, while // Spring batch would only log and keep the status COMPLETED Logger.Error(e, "Exception during postprocessor"); stepExecution.UpgradeStatus(BatchStatus.Failed); throw; } scope.Complete(); } } } // batch failed need to join the thread else if (stepExecution.remoteChunking != null) { stepExecution.remoteChunking.controlThread.Join(); } return(returnStatus); }
private void FinishTask() { try { if (CurrentTask != null) { using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { TaskDal taskDal = new TaskDal(); PositionDal positionDal = new PositionDal(); taskDal.TransactionScopeManager = TM; positionDal.TransactionScopeManager = TM; positionDal.UpdateHasGoodsToFalse(CurrentTask.CurrentPositionID); positionDal.UpdateHasGoodsToTrue(CurrentTask.NextPositionID); taskDal.UpdateTaskPosition(CurrentTask.ID, CurrentTask.NextPositionID); taskDal.UpdateTaskPositionStateToArrived(CurrentTask.ID); taskDal.UpdateTaskStateToWaiting(CurrentTask.ID); if (CurrentTask.NextPositionID == CurrentTask.EndPositionID && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "03") && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "04"))//小品种,异型烟,由手持PDA完成; { if (CurrentTask.TaskType == "02") { string orderType = taskDal.GetOrderType(CurrentTask.ID); string orderID = taskDal.GetOrderID(CurrentTask.ID); int allotID = taskDal.GetAllotID(CurrentTask.ID); string originCellCode = taskDal.GetOriginCellCode(CurrentTask.ID); string targetCellCode = taskDal.GetTargetCellCode(CurrentTask.ID); string originStorageCode = taskDal.GetOriginStorageCode(CurrentTask.ID); string targetStorageCode = taskDal.GetTargetStorageCode(CurrentTask.ID); RestClient rest = new RestClient(); if (!rest.FinishTask(CurrentTask.ID, orderType, orderID, allotID,originCellCode,targetCellCode, originStorageCode, targetStorageCode)) { Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID)); return; } else { taskDal.UpdateTaskStateToExecuted(CurrentTask.ID); } } else { if (!Ops.Write(memoryServiceName, memoryItemName, CurrentTask.ID)) { Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID)); return; } } } TM.Commit(); CurrentTask = null; CurrentTaskFactory = null; } } } catch (Exception ex) { Logger.Error("SRM.FinishTask 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
public override void Execute() { try { int productID = 0, quantity = 0; object state = AutomationContext.Read(memoryServiceName, memoryItemName); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { productID = Convert.ToInt32(arrayObj.GetValue(0)); quantity = Convert.ToInt32(arrayObj.GetValue(1)); } } if (productID == 0 || quantity == 0) return; state = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Scan_Request); state = ObjectUtil.GetObject(state); if (state == null || !Convert.ToBoolean(state)) return; if (!ScanManagerView.InitCigaretteScanInfoStack()) return; var scanInfo = CigaretteScanInfoStack .Where(c => c.Value.ProductNo == productID && c.Value.State == "0") .Select(c=> c.Value) .FirstOrDefault(); if (scanInfo == null) { Logger.Info("当前整托盘入库品牌已经由件烟扫码开始进行扫码或没有扫码任务!"); return; } using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { taskDal.TransactionScopeManager = TM; int taskID = taskDal.GetTask(productID, quantity); if (taskID != 0) { string positionName = taskDal.GetTaskNextPosition(taskID); if (positionName != string.Empty) { int[] data = new int[] { taskID, Convert.ToInt32(positionName), 1 }; AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info, data); Thread.Sleep(sleepTime); obj = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Task_Info); obj = ObjectUtil.GetObjects(obj); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 3 && data[0] == Convert.ToInt32(arrayObj.GetValue(0)) && data[1] == Convert.ToInt32(arrayObj.GetValue(1)) && data[2] == Convert.ToInt32(arrayObj.GetValue(2))) { //更新任务状态为,到达当前位置; taskDal.UpdateTaskPositionStateToArrived(taskID); AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info_Complete, 1); TM.Commit(); scanInfo.ScanQuantity += quantity; AutomationContext.Write(memoryServiceName1, memoryItemName1, CigaretteScanInfoStack); Logger.Info(string.Format("任务号[{0}]整托盘入库成功!",taskID)); return; } } } } Logger.Info(string.Format("整托盘入库失败,简码:[{0}],数量: [{0}]", productID, quantity)); } } catch (Exception ex) { Logger.Error("WholePalletTaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
//码垛完成后申请分配入库任务; public override void Execute() { try { int productID = 0, quantity = 0, taskID = 0; object state = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info_Request); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { productID = Convert.ToInt32(arrayObj.GetValue(0)); quantity = Convert.ToInt32(arrayObj.GetValue(1)); } } if (productID == 0 || quantity == 0) { return; } int[] data = new int[] { productID, quantity }; string msg = "TaskRequest : "; for (int i = 0; i < data.Length; i++) msg += string.Format("[{0}]", data[i]); Logger.Info(msg); using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { taskDal.TransactionScopeManager = TM; taskID = taskDal.GetTask(productID, quantity); if (taskID != 0) { string positionName = taskDal.GetTaskNextPosition(taskID); if (positionName != string.Empty) { data = new int[] { taskID, Convert.ToInt32(positionName), 1 }; AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data); Thread.Sleep(sleepTime); obj = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info); obj = ObjectUtil.GetObjects(obj); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 3 && data[0] == Convert.ToInt32(arrayObj.GetValue(0)) && data[1] == Convert.ToInt32(arrayObj.GetValue(1)) && data[2] == Convert.ToInt32(arrayObj.GetValue(2))) { //更新任务状态为,到达当前位置; taskDal.UpdateTaskPositionStateToArrived(taskID); AutomationContext.Write(plcServiceName, O_StockIn_Task_Info_Complete, 1); TM.Commit(); } } } } } } catch (Exception ex) { Logger.Error("TaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
private void FinishTask() { try { if (CurrentTask != null) { using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { TaskDal taskDal = new TaskDal(); PositionDal positionDal = new PositionDal(); taskDal.TransactionScopeManager = TM; positionDal.TransactionScopeManager = TM; positionDal.UpdateHasGoodsToFalse(CurrentTask.CurrentPositionID); positionDal.UpdateHasGoodsToTrue(CurrentTask.NextPositionID); taskDal.UpdateTaskPosition(CurrentTask.ID, CurrentTask.NextPositionID); taskDal.UpdateTaskPositionStateToArrived(CurrentTask.ID); taskDal.UpdateTaskStateToWaiting(CurrentTask.ID); if (CurrentTask.NextPositionID == CurrentTask.EndPositionID && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "03") && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "04")) //小品种,异型烟,由手持PDA完成; { if (CurrentTask.TaskType == "02") { string orderType = taskDal.GetOrderType(CurrentTask.ID); string orderID = taskDal.GetOrderID(CurrentTask.ID); int allotID = taskDal.GetAllotID(CurrentTask.ID); string originCellCode = taskDal.GetOriginCellCode(CurrentTask.ID); string targetCellCode = taskDal.GetTargetCellCode(CurrentTask.ID); string originStorageCode = taskDal.GetOriginStorageCode(CurrentTask.ID); string targetStorageCode = taskDal.GetTargetStorageCode(CurrentTask.ID); RestClient rest = new RestClient(); if (!rest.FinishTask(CurrentTask.ID, orderType, orderID, allotID, originCellCode, targetCellCode, originStorageCode, targetStorageCode)) { Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID)); return; } else { taskDal.UpdateTaskStateToExecuted(CurrentTask.ID); } } else { if (!Ops.Write(memoryServiceName, memoryItemName, CurrentTask.ID)) { Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID)); return; } } } TM.Commit(); CurrentTask = null; CurrentTaskFactory = null; } } } catch (Exception ex) { Logger.Error("SRM.FinishTask 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
//码垛完成后申请分配入库任务; public override void Execute() { try { int productID = 0, quantity = 0, taskID = 0; object state = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info_Request); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { productID = Convert.ToInt32(arrayObj.GetValue(0)); quantity = Convert.ToInt32(arrayObj.GetValue(1)); } } if (productID == 0 || quantity == 0) { return; } int[] data = new int[] { productID, quantity }; string msg = "TaskRequest : "; for (int i = 0; i < data.Length; i++) { msg += string.Format("[{0}]", data[i]); } Logger.Info(msg); using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { taskDal.TransactionScopeManager = TM; taskID = taskDal.GetTask(productID, quantity); if (taskID != 0) { string positionName = taskDal.GetTaskNextPosition(taskID); if (positionName != string.Empty) { data = new int[] { taskID, Convert.ToInt32(positionName), 1 }; AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data); Thread.Sleep(sleepTime); obj = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info); obj = ObjectUtil.GetObjects(obj); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 3 && data[0] == Convert.ToInt32(arrayObj.GetValue(0)) && data[1] == Convert.ToInt32(arrayObj.GetValue(1)) && data[2] == Convert.ToInt32(arrayObj.GetValue(2))) { //更新任务状态为,到达当前位置; taskDal.UpdateTaskPositionStateToArrived(taskID); AutomationContext.Write(plcServiceName, O_StockIn_Task_Info_Complete, 1); TM.Commit(); } } } } } } catch (Exception ex) { Logger.Error("TaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }
public void EbcdicFileTestTransactionalWrite() { // local resources IResource fileResource = new FileSystemResource(new FileInfo("C:/temp/outputs/PersonWritten.txt")); var executionContext = new ExecutionContext(); FileInfo fileInfo = new FileInfo("Ebcdic/Resources/copybooks/Person.fileformat"); IResource copybookResource = new FileSystemResource(fileInfo); //1. WRITE EbcdicWriterMapper writerMapper = new EbcdicWriterMapper(); writerMapper.AfterPropertiesSet(); var writer = new EbcdicFileWriter <Ebcdic.Test.Person> { AppendAllowed = false, WriteRdw = false, Name = "PersonWriter", Resource = fileResource, EbcdicWriterMapper = writerMapper, DefaultValue = EbcdicEncoder.DefaultValue.LowValue, Copybooks = new List <IResource> { new FileSystemResource(fileInfo) } }; writer.AfterPropertiesSet(); writer.Open(executionContext); try { for (int i = 0; i < CountTransactions; i++) { using (TransactionScope scope = TransactionScopeManager.CreateScope()) { writer.Write(GetPersons(i)); if (i == CountTransactions - 1) //SIMULATE FAILURE { throw new Exception("Bailing out ... should rollback ..."); } scope.Complete(); } } } catch (Exception) { // DISCARDED (JUST TO AVOID UNIT TEST FAILURE ...) } writer.Close(); Assert.IsTrue(System.IO.File.Exists("C:/temp/outputs/PersonWritten.txt")); Assert.IsTrue(new FileInfo("C:/temp/outputs/PersonWritten.txt").Length > 0); //2.READ WHAT WAS WRITTEN var reader = new EbcdicFileReader <Ebcdic.Test.Person> { EbcdicReaderMapper = new PersonMapper(), Rdw = false, Resource = fileResource, Name = "PersonReader", SaveState = false, Copybook = copybookResource }; reader.AfterPropertiesSet(); var persons = new List <Ebcdic.Test.Person>(); reader.Open(executionContext); Ebcdic.Test.Person person; while ((person = reader.Read()) != null) { persons.Add(person); } reader.Close(); Assert.AreEqual(CountObject * (CountTransactions - 1), persons.Count); foreach (Ebcdic.Test.Person p in persons) { Assert.AreEqual(p.Id, p.Value); Assert.IsTrue(p.Name.StartsWith("Name_" + p.Id)); } }
/// <summary> /// Custom constructor with path and FileMode. /// </summary> /// <param name="path"></param> /// <param name="fileMode"></param> public TransactionAwareFileStream(string path, FileMode fileMode) : base(path, fileMode) { _internalBuffer = new List <byte>(); TransactionScopeManager.RegisterResource(this); }
private void DownloadData() { try { using (TransactionScopeManager TM = new TransactionScopeManager()) { OrderDal orderDal = new OrderDal(); orderDal.TransactionScopeManager = TM; if (orderDal.FindUnsortCount() == true) { if (DialogResult.Cancel == MessageBox.Show("还有未分拣的数据,您确定要重新下载数据吗?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)) { return; } } ChannelDal channelDal = new ChannelDal(); ServerDal serverDal = new ServerDal(); DataTable table = serverDal.FindBatch(); if (table.Rows.Count != 0) { string batchsortid = table.Rows[0]["batch_no"].ToString(); orderDal.DeleteExportData();//删除贴标机数据(未实现删除哪些表) //AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data); //下载烟道表 table = serverDal.FindChannel(batchsortid); channelDal.InsertChannel(table); System.Threading.Thread.Sleep(100); //下载订单主表 table = serverDal.FindOrderMaster(batchsortid); orderDal.InsertMaster(table); System.Threading.Thread.Sleep(100); //下载订单明细表 table = serverDal.FindOrderDetail(batchsortid); orderDal.InsertOrderDetail(table); //下载手工补货订单明细表 table = serverDal.FindHandleSupply(batchsortid); orderDal.InsertHandleSupply(table); //更新批次状态(下载完成) serverDal.UpdateBatchStatus(batchsortid); MessageBox.Show("数据下载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //Context.ProcessDispatcher.WriteToProcess("LEDProcess", "NewData", null); //Context.ProcessDispatcher.WriteToProcess("CreatePackAndPrintDataProcess", "NewData", null); //Context.ProcessDispatcher.WriteToProcess("CurrentOrderProcess", "CurrentOrderA", new int[] { -1 }); //Context.ProcessDispatcher.WriteToProcess("monitorView", "ProgressState", new ProgressState()); } else { MessageBox.Show("没有需要分拣的订单数据。", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } catch (Exception e) { Logger.Error("下载数据失败!原因:" + e.Message); } }
public override void Execute() { try { int productID = 0, quantity = 0; object state = AutomationContext.Read(memoryServiceName, memoryItemName); object obj = ObjectUtil.GetObjects(state); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 2) { productID = Convert.ToInt32(arrayObj.GetValue(0)); quantity = Convert.ToInt32(arrayObj.GetValue(1)); } } if (productID == 0 || quantity == 0) { return; } state = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Scan_Request); state = ObjectUtil.GetObject(state); if (state == null || !Convert.ToBoolean(state)) { return; } if (!ScanManagerView.InitCigaretteScanInfoStack()) { return; } var scanInfo = CigaretteScanInfoStack .Where(c => c.Value.ProductNo == productID && c.Value.State == "0") .Select(c => c.Value) .FirstOrDefault(); if (scanInfo == null) { Logger.Info("当前整托盘入库品牌已经由件烟扫码开始进行扫码或没有扫码任务!"); return; } using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable)) { taskDal.TransactionScopeManager = TM; int taskID = taskDal.GetTask(productID, quantity); if (taskID != 0) { string positionName = taskDal.GetTaskNextPosition(taskID); if (positionName != string.Empty) { int[] data = new int[] { taskID, Convert.ToInt32(positionName), 1 }; AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info, data); Thread.Sleep(sleepTime); obj = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Task_Info); obj = ObjectUtil.GetObjects(obj); if (obj is Array) { Array arrayObj = (Array)obj; if (arrayObj.Length == 3 && data[0] == Convert.ToInt32(arrayObj.GetValue(0)) && data[1] == Convert.ToInt32(arrayObj.GetValue(1)) && data[2] == Convert.ToInt32(arrayObj.GetValue(2))) { //更新任务状态为,到达当前位置; taskDal.UpdateTaskPositionStateToArrived(taskID); AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info_Complete, 1); TM.Commit(); scanInfo.ScanQuantity += quantity; AutomationContext.Write(memoryServiceName1, memoryItemName1, CigaretteScanInfoStack); Logger.Info(string.Format("任务号[{0}]整托盘入库成功!", taskID)); return; } } } } Logger.Info(string.Format("整托盘入库失败,简码:[{0}],数量: [{0}]", productID, quantity)); } } catch (Exception ex) { Logger.Error("WholePalletTaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace); } }