Пример #1
0
        /// <summary>
        /// Push a request in right custom output
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        public TContext Execute(ActionOrder order)
        {
            TContext context = null;

            if (!_dic.TryGetValue(order.Name, out ActionModel action))
            {
                throw new InvalidOperationException(order.Name);
            }

            order.ExecutedAt = ClockActionBus.Now();

            Stopwatch sp = new Stopwatch();

            try
            {
                sp.Start();
                context       = (TContext)action.Execute(this, order);
                order.Result  = context.Result;
                order.Success = true;
            }
            catch (Exception e)
            {
                context.Exception = e;
            }
            finally
            {
                sp.Stop();
                string key = string.Empty;
                Trace.WriteLine(new { Key = key, action.Name, ElapsedTime = sp.Elapsed }, ConstantsCore.PerfMon);
            }

            return(context);
        }
Пример #2
0
        public void UnserializeTest()
        {
            var o = new ActionOrder()
            {
                Uuid       = Guid.NewGuid().ToString(),
                Name       = "actionTest",
                ExecutedAt = ClockActionBus.Now(),
                PushedAt   = ClockActionBus.Now(),
                Result     = "ok",
                Success    = false,
            }.Argument("arg1", "{ \"test\": \"ok\" }")
            ;

            var txt = o.ToString();
            var p   = ActionOrder.Unserialize(txt);

            Assert.AreEqual(o.ExecutedAt, p.ExecutedAt);
            Assert.AreEqual(o.Name, p.Name);
            Assert.AreEqual(o.PushedAt, p.PushedAt);
            Assert.AreEqual(o.Result, p.Result);
            Assert.AreEqual(o.Success, p.Success);
            Assert.AreEqual(o.Uuid, p.Uuid);

            Assert.AreEqual(o.Arguments.Count, 1);
            Assert.AreEqual(o.Arguments.Count, p.Arguments.Count);

            var txt2 = p.ToString();
            var q    = ActionOrder.Unserialize(txt2);

            Assert.AreEqual(p.Arguments["arg1"].Value, q.Arguments["arg1"].Value);

            Assert.AreEqual(txt, txt2);
        }
Пример #3
0
        private Task Callback(IBrokerContext context)
        {
            var ctx = (ActionBusContext)_action.Evaluate(context.Utf8Data);

            if (ctx.Exception == null)
            {
                _acknowledgeQueue.Publish(
                    new
                {
                    context.Utf8Data,
                    Exception = ctx.Exception
                }
                    );

                context.Commit();
            }
            else
            {
                if (context.CanBeRequeued())
                {
                    context.RequeueLast();
                }

                else
                {
                    Dictionary <string, object> _headers = new Dictionary <string, object>();
                    foreach (var item in context.Headers)
                    {
                        _headers.Add(item.Key, System.Text.Encoding.ASCII.GetString((byte[])item.Value));
                    }

                    _deadQueue.Publish(
                        new
                    {
                        RepushedAt       = ClockActionBus.Now(),
                        OriginExchange   = context.Exchange,
                        OriginRoutingKey = context.RoutingKey,
                        ctx.Exception
                    },
                        _headers
                        );

                    context.Commit();
                }
            }

            return(Task.CompletedTask);
        }