Ejemplo n.º 1
0
        public void EnqueueTest()
        {
            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 request         = new EnqueueListRequest();
                request.PartnerCode = "TST";
                request.MessageList = new[]
                {
                    new QueueMessage
                    {
                        Data = "test data",
                        QueueMessageTypeCode = "TST"
                    }
                };

                var response = svc.EnqueueListIn(request);
                response.MessageList.Should().HaveCount(1);
                response.MessageList[0].ID.Should().HaveValue();
                response.MessageList[0].QueueMessageTypeCode.ShouldBeEquivalentTo(request.MessageList[0].QueueMessageTypeCode);
                response.MessageList[0].Data.ShouldBeEquivalentTo(request.MessageList[0].Data);

                using (var session = factory.OpenSession())
                    using (var transaction = session.BeginTransaction())
                    {
                        foreach (var message in response.MessageList)
                        {
                            var item = session.Get <IoQueueIn>(message.ID);
                            //TODO: проверка, что записалось правильно

                            // удалеям лишнее
                            session.Delete(item);
                        }
                        transaction.Commit();
                    }
            });
        }
Ejemplo n.º 2
0
        public EnqueueListResponse EnqueueListIn(EnqueueListRequest request)
        {
            Contract.Requires(request != null);
            try
            {
                if (request == null)
                {
                    throw new InvalidOperationException("EnqueueListRequest is empty");
                }

                if (string.IsNullOrEmpty(request.PartnerCode))
                {
                    throw new InvalidOperationException("EnqueueListRequest.PartnerCode is empty");
                }

                if (request.MessageList == null || request.MessageList.Length == 0)
                {
                    throw new InvalidOperationException("EnqueueListRequest.MessageList is empty");
                }

                using (var session = _sessionFactory.OpenSession())
                {
                    // получим все типы сообщений
                    var messageTypes = session.Query <IoQueueMessageType>().ToList();

                    // получаем партнера по коду
                    var partner = session.Query <WmsMandant>().FirstOrDefault(p => p.PartnerCode == request.PartnerCode);
                    if (partner == null)
                    {
                        throw new InvalidOperationException(string.Format("Unknown partner code '{0}'.", request.PartnerCode));
                    }

                    Log.DebugFormat("EnqueueListIn for Partner='{0}' with MessagesCount={1}", request.PartnerCode,
                                    request.MessageList.Length);

                    var queueInList = request.MessageList.Select(m => new IoQueueIn()
                    {
                        GroupCode         = m.GroupCode,
                        Message           = m.Message,
                        Mandant           = partner,
                        ProcessCode       = m.ProcessCode,
                        QueueMessageState = QueueMessageStates.Ready,
                        QueueMessageType  = ValidateMessageType(messageTypes, m.QueueMessageTypeCode),
                        QueueOut          = m.RelatedQueue != null
                            ? session.Query <IoQueueOut>().FirstOrDefault(o => o.ID == m.RelatedQueue)
                            : null,
                        Data = Encoding.UTF8.GetBytes(m.Data)
                    }).ToList();

                    using (var transaction = session.BeginTransaction())
                    {
                        foreach (var q in queueInList)
                        {
                            session.Save(q);
                        }
                        transaction.Commit();
                    }

                    var messageList = queueInList.Select(q => new QueueMessage
                    {
                        GroupCode             = q.GroupCode,
                        ID                    = q.ID,
                        Message               = q.Message,
                        ProcessCode           = q.ProcessCode,
                        QueueMessageStateCode = q.QueueMessageState.ToString().ToUpper(),
                        QueueMessageTypeCode  = q.QueueMessageType.Code,
                        RelatedQueue          = q.QueueOut == null ? (Guid?)null : q.QueueOut.ID,
                        Data                  = q.Data != null ? Encoding.UTF8.GetString(q.Data) : null
                    }).ToList();

                    return(new EnqueueListResponse
                    {
                        MessageList = messageList.ToArray(),
                        PartnerCode = partner.PartnerCode
                    });
                }
            }
            catch (Exception ex)
            {
                Log.Error("EnqueueListIn error:", ex);
                Log.Debug(request.DumpToXML());
                throw;
            }
        }