Пример #1
0
        /// <summary>
        /// 依次获取单个消息
        /// </summary>
        /// <param name="connection">消息队列连接对象</param>
        /// <param name="QueueName">队列名称</param>
        /// <param name="durable">持久化</param>
        /// <param name="dealMessage">处理消息委托</param>
        public static void ConsumeMsgSingle(IConnection connection, string QueueName, bool durable, Func <string, ConsumeAction> dealMessage)
        {
            try
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(QueueName, durable, false, false, null); //获取队列
                    channel.BasicQos(0, 1, false);                                //分发机制为触发式

                    uint msgCount = channel.MessageCount(QueueName);

                    if (msgCount > 0)
                    {
                        var consumer = new QueueingBasicConsumer(channel); //建立消费者
                        // 从左到右参数意思分别是:队列名称、是否读取消息后直接删除消息,消费者
                        channel.BasicConsume(QueueName, false, consumer);

                        ConsumeAction consumeResult = ConsumeAction.RETRY;
                        var           ea            = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); //获取消息
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body);
                            consumeResult = dealMessage(message);
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                        finally
                        {
                            if (consumeResult == ConsumeAction.ACCEPT)
                            {
                                channel.BasicAck(ea.DeliveryTag, false);  //消息从队列中删除
                            }
                            else if (consumeResult == ConsumeAction.RETRY)
                            {
                                channel.BasicNack(ea.DeliveryTag, false, true); //消息重回队列
                            }
                            else
                            {
                                channel.BasicNack(ea.DeliveryTag, false, false); //消息直接丢弃
                            }
                        }
                    }
                    else
                    {
                        dealMessage(string.Empty);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ResetMQConnectionToFree(connection);
            }
        }
 public static UpdateQuestModelMasterRequest FromDict(JsonData data)
 {
     return(new UpdateQuestModelMasterRequest {
         namespaceName = data.Keys.Contains("namespaceName") && data["namespaceName"] != null ? data["namespaceName"].ToString(): null,
         questGroupName = data.Keys.Contains("questGroupName") && data["questGroupName"] != null ? data["questGroupName"].ToString(): null,
         questName = data.Keys.Contains("questName") && data["questName"] != null ? data["questName"].ToString(): null,
         description = data.Keys.Contains("description") && data["description"] != null ? data["description"].ToString(): null,
         metadata = data.Keys.Contains("metadata") && data["metadata"] != null ? data["metadata"].ToString(): null,
         contents = data.Keys.Contains("contents") && data["contents"] != null ? data["contents"].Cast <JsonData>().Select(value =>
         {
             return Contents.FromDict(value);
         }
                                                                                                                           ).ToList() : null,
         challengePeriodEventId = data.Keys.Contains("challengePeriodEventId") && data["challengePeriodEventId"] != null ? data["challengePeriodEventId"].ToString(): null,
         consumeActions = data.Keys.Contains("consumeActions") && data["consumeActions"] != null ? data["consumeActions"].Cast <JsonData>().Select(value =>
         {
             return ConsumeAction.FromDict(value);
         }
                                                                                                                                                   ).ToList() : null,
         failedAcquireActions = data.Keys.Contains("failedAcquireActions") && data["failedAcquireActions"] != null ? data["failedAcquireActions"].Cast <JsonData>().Select(value =>
         {
             return AcquireAction.FromDict(value);
         }
                                                                                                                                                                           ).ToList() : null,
         premiseQuestNames = data.Keys.Contains("premiseQuestNames") && data["premiseQuestNames"] != null ? data["premiseQuestNames"].Cast <JsonData>().Select(value =>
         {
             return value.ToString();
         }
                                                                                                                                                               ).ToList() : null,
     });
 }
        protected virtual void ProcessConsumeAction(ConsumeAction action, List <StackResponseContainerInfo> stackResponses)
        {
            byte count = action.Count;
            StackRequestSlotInfo source = action.Source;

            Item sourceItem = GetContainerItem(source.ContainerId, source.Slot);

            sourceItem.Count -= count;
            if (sourceItem.Count <= 0)
            {
                sourceItem = new ItemAir();
                SetContainerItem(source.ContainerId, source.Slot, sourceItem);
            }

            stackResponses.Add(new StackResponseContainerInfo
            {
                ContainerId = source.ContainerId,
                Slots       = new List <StackResponseSlotInfo>
                {
                    new StackResponseSlotInfo()
                    {
                        Count          = sourceItem.Count,
                        Slot           = source.Slot,
                        HotbarSlot     = source.Slot,
                        StackNetworkId = sourceItem.UniqueId
                    }
                }
            });
        }
Пример #4
0
 public static UpdateRateModelMasterRequest FromDict(JsonData data)
 {
     return(new UpdateRateModelMasterRequest {
         namespaceName = data.Keys.Contains("namespaceName") && data["namespaceName"] != null ? data["namespaceName"].ToString(): null,
         rateName = data.Keys.Contains("rateName") && data["rateName"] != null ? data["rateName"].ToString(): null,
         description = data.Keys.Contains("description") && data["description"] != null ? data["description"].ToString(): null,
         metadata = data.Keys.Contains("metadata") && data["metadata"] != null ? data["metadata"].ToString(): null,
         timingType = data.Keys.Contains("timingType") && data["timingType"] != null ? data["timingType"].ToString(): null,
         lockTime = data.Keys.Contains("lockTime") && data["lockTime"] != null ? (int?)int.Parse(data["lockTime"].ToString()) : null,
         enableSkip = data.Keys.Contains("enableSkip") && data["enableSkip"] != null ? (bool?)bool.Parse(data["enableSkip"].ToString()) : null,
         skipConsumeActions = data.Keys.Contains("skipConsumeActions") && data["skipConsumeActions"] != null ? data["skipConsumeActions"].Cast <JsonData>().Select(value =>
         {
             return ConsumeAction.FromDict(value);
         }
                                                                                                                                                                   ).ToList() : null,
         acquireActions = data.Keys.Contains("acquireActions") && data["acquireActions"] != null ? data["acquireActions"].Cast <JsonData>().Select(value =>
         {
             return AcquireAction.FromDict(value);
         }
                                                                                                                                                   ).ToList() : null,
         consumeActions = data.Keys.Contains("consumeActions") && data["consumeActions"] != null ? data["consumeActions"].Cast <JsonData>().Select(value =>
         {
             return ConsumeAction.FromDict(value);
         }
                                                                                                                                                   ).ToList() : null,
     });
 }
Пример #5
0
        ActionState ProcessAction(ConsumeAction action)
        {
            if (this.ActionTicksUsed == 1)
            {
                var item = this.Inventory.FirstOrDefault(o => o.ObjectID == action.ItemID) as ItemObject;

                if (CheckConsumeAction(item) == false)
                    return ActionState.Fail;

                this.ActionTotalTicks = 6;

                return ActionState.Ok;
            }
            else if (this.ActionTicksUsed < this.ActionTotalTicks)
            {
                return ActionState.Ok;
            }
            else
            {
                var item = this.Inventory.FirstOrDefault(o => o.ObjectID == action.ItemID) as ItemObject;

                if (CheckConsumeAction(item) == false)
                    return ActionState.Fail;

                // Send report before destruct
                SendReport(new ConsumeActionReport(this, item));

                item.Destruct();

                this.Hunger = Math.Max(this.Hunger - item.NutritionalValue, 0);
                this.Thirst = Math.Max(this.Thirst - item.RefreshmentValue, 0);

                return ActionState.Done;
            }
        }
        protected override GameAction PrepareNextActionOverride(out JobStatus progress)
        {
            var action = new ConsumeAction(m_item);

            progress = JobStatus.Ok;
            return(action);
        }
Пример #7
0
        /// <summary>
        /// 消费消息
        /// </summary>
        /// <param name="connection">消息队列连接对象</param>
        /// <param name="queueName">队列名称</param>
        /// <param name="durable">是否持久化</param>
        /// <param name="dealMessage">消息处理函数</param>
        /// <param name="saveLog">保存日志方法,可选</param>
        public static void ConsumeMsg(IConnection connection, string queueName, bool durable, Func <string, ConsumeAction> dealMessage, Action <string, Exception> saveLog = null)
        {
            try
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queueName, durable, false, false, null); //获取队列
                    channel.BasicQos(0, 1, false);                                //分发机制为触发式

                    var consumer = new QueueingBasicConsumer(channel);            //建立消费者
                    // 从左到右参数意思分别是:队列名称、是否读取消息后直接删除消息,消费者
                    channel.BasicConsume(queueName, false, consumer);

                    while (true)  //如果队列中有消息
                    {
                        ConsumeAction consumeResult = ConsumeAction.RETRY;
                        var           ea            = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); //获取消息
                        string        message       = null;
                        try
                        {
                            var body = ea.Body;
                            message       = Encoding.UTF8.GetString(body);
                            consumeResult = dealMessage(message);
                        }
                        catch (Exception ex)
                        {
                            if (saveLog != null)
                            {
                                saveLog(message, ex);
                            }
                        }
                        if (consumeResult == ConsumeAction.ACCEPT)
                        {
                            channel.BasicAck(ea.DeliveryTag, false);  //消息从队列中删除
                        }
                        else if (consumeResult == ConsumeAction.RETRY)
                        {
                            channel.BasicNack(ea.DeliveryTag, false, true); //消息重回队列
                        }
                        else
                        {
                            channel.BasicNack(ea.DeliveryTag, false, false); //消息直接丢弃
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (saveLog != null)
                {
                    saveLog("QueueName:" + queueName, ex);
                }
                throw ex;
            }
            finally
            {
                ResetMQConnectionToFree(connection);
            }
        }
Пример #8
0
 private static string GetConsumeActionReport(ConsumeAction act)
 {
     return(String.Format(
                "Agent {0} is consuming {1} units of {2}.",
                act.Consumer.AgentNumber,
                act.Quantity,
                act.Good.Name));
 }
Пример #9
0
        public async Task WhenPlayerTriesToConsumePotionThatDoesNotExist_ThenArgumentExceptionIsThrown()
        {
            var nonExistingPotionId = "nonExistingId";

            var consumeAction = new ConsumeAction(_player.Id, nonExistingPotionId);

            _registry.Setup(i => i.GetById(It.IsAny <string>())).Returns(_player);

            await Assert.ThrowsExceptionAsync <ArgumentException>(() => _resolver.ResolveAsync(consumeAction));
        }
Пример #10
0
        public async Task WhenCreatureIdIsNotFound_ThenArgumentExceptionIsThrown()
        {
            var creatureId    = "arbitraryId";
            var potionId      = "arbitraryPotionId";
            var consumeAction = new ConsumeAction(creatureId, potionId);

            _registry.Setup(i => i.GetById(It.IsAny <string>())).Returns(default(Creature));

            await Assert.ThrowsExceptionAsync <ArgumentException>(() => _resolver.ResolveAsync(consumeAction));
        }
Пример #11
0
        public async Task WhenSuccessfullyConsumingAPotion_ThenThatPotionIsRemovedFromInventory()
        {
            var healingPotion = _potionFactory.CreateByName("Small Healing Potion");

            _player.Inventory.Items.Add(healingPotion);
            var consumeAction = new ConsumeAction(_player.Id, healingPotion.Id);

            _registry.Setup(i => i.GetById(It.IsAny <string>())).Returns(_player);

            var inventoryCountBeforeConsumption = _player.Inventory.Items.Count;
            await _resolver.ResolveAsync(consumeAction);

            var inventoryCountAfterConsumption = _player.Inventory.Items.Count;

            Assert.AreEqual(inventoryCountBeforeConsumption - 1, inventoryCountAfterConsumption);
        }
Пример #12
0
        public async Task WhenConsumingHealingPotionEffectExtendsMaxHitPoints_ThenHitPointsAreLimitedToMax()
        {
            var healingPotion    = _potionFactory.CreateByName("Small Healing Potion");
            var currentHitpoints = _player.Statistics.DefenseScores.HitPoints.Max - healingPotion.Amount + 2;

            _player.Statistics.DefenseScores.HitPoints.Current = currentHitpoints;
            _player.Inventory.Items.Add(healingPotion);
            var consumeAction = new ConsumeAction(_player.Id, healingPotion.Id);

            _registry.Setup(i => i.GetById(It.IsAny <string>())).Returns(_player);

            await _resolver.ResolveAsync(consumeAction);

            var expectedHitPoints = _player.Statistics.DefenseScores.HitPoints.Max;

            Assert.AreEqual(expectedHitPoints, _player.Statistics.DefenseScores.HitPoints.Current);
        }
 public static UpdateSalesItemMasterRequest FromDict(JsonData data)
 {
     return(new UpdateSalesItemMasterRequest {
         namespaceName = data.Keys.Contains("namespaceName") && data["namespaceName"] != null ? data["namespaceName"].ToString(): null,
         salesItemName = data.Keys.Contains("salesItemName") && data["salesItemName"] != null ? data["salesItemName"].ToString(): null,
         description = data.Keys.Contains("description") && data["description"] != null ? data["description"].ToString(): null,
         metadata = data.Keys.Contains("metadata") && data["metadata"] != null ? data["metadata"].ToString(): null,
         consumeActions = data.Keys.Contains("consumeActions") && data["consumeActions"] != null ? data["consumeActions"].Cast <JsonData>().Select(value =>
         {
             return ConsumeAction.FromDict(value);
         }
                                                                                                                                                   ).ToList() : null,
         acquireActions = data.Keys.Contains("acquireActions") && data["acquireActions"] != null ? data["acquireActions"].Cast <JsonData>().Select(value =>
         {
             return AcquireAction.FromDict(value);
         }
                                                                                                                                                   ).ToList() : null,
     });
 }
Пример #14
0
        ActionState ProcessAction(ConsumeAction action)
        {
            if (this.ActionTicksUsed == 1)
            {
                var item = this.Inventory.FirstOrDefault(o => o.ObjectID == action.ItemID);

                if (CheckConsumeAction(item) == false)
                {
                    return(ActionState.Fail);
                }

                this.ActionTotalTicks = 6;

                return(ActionState.Ok);
            }
            else if (this.ActionTicksUsed < this.ActionTotalTicks)
            {
                return(ActionState.Ok);
            }
            else
            {
                var item = this.Inventory.FirstOrDefault(o => o.ObjectID == action.ItemID);

                if (CheckConsumeAction(item) == false)
                {
                    return(ActionState.Fail);
                }

                // Send report before destruct
                SendReport(new ConsumeActionReport(this, item));

                item.Destruct();

                this.Hunger = Math.Max(this.Hunger - item.NutritionalValue, 0);
                this.Thirst = Math.Max(this.Thirst - item.RefreshmentValue, 0);

                return(ActionState.Done);
            }
        }
Пример #15
0
 protected override GameAction PrepareNextActionOverride(out JobStatus progress)
 {
     var action = new ConsumeAction(m_item);
     progress = JobStatus.Ok;
     return action;
 }