/// <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 } } }); }
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, }); }
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); }
/// <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); } }
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)); }
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)); }
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)); }
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); }
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, }); }
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); } }
protected override GameAction PrepareNextActionOverride(out JobStatus progress) { var action = new ConsumeAction(m_item); progress = JobStatus.Ok; return action; }