public void DequeueTest() { UnityConfig.RegisterComponents(container => { var svc = container.Resolve <QueueService>(); var factory = container.Resolve <ISessionFactory>(); container.RegisterType <IWmsEnvironmentInfoProvider, SvcWmsEnvironmentInfoProvider>(new ContainerControlledLifetimeManager()); container.RegisterType <ILocalData, ThreadStaticLocalData>(new ContainerControlledLifetimeManager()); WmsEnvironment.Init(container.Resolve <IWmsEnvironmentInfoProvider>(), container.Resolve <ILocalData>()); // пишем тестовое сообщение var outMessage = new IoQueueOut(); using (var session = factory.OpenSession()) using (var transaction = session.BeginTransaction()) { outMessage.Mandant = session.Query <WmsMandant>().Single(i => i.PartnerCode == "TST"); outMessage.Data = Encoding.UTF8.GetBytes("test data"); outMessage.GroupCode = Guid.NewGuid(); outMessage.QueueMessageState = QueueMessageStates.Ready; outMessage.QueueMessageType = session.Query <IoQueueMessageType>().Single(i => i.Code == "TST"); outMessage.Selector = "test selector"; outMessage.Uri = "test uri"; session.Save(outMessage); transaction.Commit(); } // создаем запрос var request = new DequeueRequest(); request.EnablePratnersCodes = "TST"; request.EnableTypes = "TST"; request.RequiresConfirmation = false; // запрашиваем var response = svc.DequeueOut(request); // проверяем ответ response.PartnerCode.ShouldBeEquivalentTo("TST"); response.MessageType = "TST"; response.Message.Should().NotBeNull(); response.Message.ID.Should().Be(outMessage.ID); response.Message.Data.Should().Be("test data"); response.Message.QueueMessageTypeCode.Should().Be("TST"); response.Message.GroupCode.Should().Be(outMessage.GroupCode); //response.Message.ID using (var session = factory.OpenSession()) using (var transaction = session.BeginTransaction()) { var item = session.Get <IoQueueOut>(outMessage.ID); session.Delete(item); transaction.Commit(); } }); }
public DequeueResponse DequeueOut(DequeueRequest request) { Contract.Requires(request != null); var enabledTypesList = new string[0]; if (!string.IsNullOrEmpty(request.EnableTypes)) { enabledTypesList = request.EnableTypes.Split(';'); } var disableTypesList = new string[0]; if (!string.IsNullOrEmpty(request.DisableTypes)) { disableTypesList = request.DisableTypes.Split(';'); } DequeueResponse dequeueResponse = null; using (var session = _sessionFactory.OpenSession()) { IoQueueOut queueOut = null; try { queueOut = GetIoQueueOut(session, enabledTypesList, disableTypesList, request.Selector); if (queueOut == null) { return(new DequeueResponse()); } var queueMessage = new QueueMessage { ID = queueOut.ID, GroupCode = queueOut.GroupCode, Message = queueOut.Message, ProcessCode = queueOut.ProcessCode, QueueMessageStateCode = queueOut.QueueMessageState.ToString().ToUpper(), QueueMessageTypeCode = queueOut.QueueMessageType.Code, RelatedQueue = queueOut.QueueIn != null ? queueOut.QueueIn.ID : (Guid?)null, Data = queueOut.Data != null?Encoding.UTF8.GetString(queueOut.Data) : null, Selector = queueOut.Selector, Uri = queueOut.Uri }; dequeueResponse = new DequeueResponse { // если партнера нет - то так и передаем. (возможно стоит ругаться) PartnerCode = queueOut.Mandant == null ? null : queueOut.Mandant.PartnerCode, MessageType = queueOut.QueueMessageType.Code, DateIns = queueOut.DateIns, Message = queueMessage }; // фиксируем статус обработки using (var transaction = session.BeginTransaction()) { queueOut.QueueMessageState = request.RequiresConfirmation ? QueueMessageStates.Processing : QueueMessageStates.Completed; dequeueResponse.Message.QueueMessageStateCode = queueOut.QueueMessageState.ToString().ToUpper(); transaction.Commit(); } } catch (Exception ex) { Log.Error("Dequeue out error:", ex); if (dequeueResponse != null) { dequeueResponse.Message.QueueMessageStateCode = QueueMessageStates.Error.ToString().ToUpper(); dequeueResponse.Message.Message = ex.Message; Log.Debug(dequeueResponse.DumpToXML()); } if (queueOut != null) { FillError(_sessionFactory, queueOut.ID, ex); } throw new FaultException(new FaultReason("Process dequeue exception: " + ex.Message)); } } return(dequeueResponse); }