Пример #1
0
        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();
                    }
            });
        }
Пример #2
0
        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);
        }