Ejemplo n.º 1
0
        protected override void DoFilterWork(WorkContext work, IList <WorkFilter> filters, int thisFilterIndex)
        {
            var original = ExecutionContext.CallFlow;

            try
            {
                var hdrName = DistributedCallFlowHeader;
                if (hdrName.IsNotNullOrWhiteSpace() && !(original is DistributedCallFlow))
                {
                    DistributedCallFlow flow = null;
                    var hdrJson = work.Request.Headers[hdrName];

                    if (hdrJson.IsNotNullOrWhiteSpace())
                    {
                        JsonDataMap existing;

                        try   { existing = (hdrJson.JsonToDataObject() as JsonDataMap).IsTrue(v => v != null && v.Count > 0, nameof(existing)); }
                        catch { throw HTTPStatusException.BadRequest_400("Bad distributed call flow header"); }

                        flow = DistributedCallFlow.Continue(App, existing);
                    }

                    if (flow == null)
                    {
                        flow = DistributedCallFlow.Start(App, App.Description);
                    }
                }

                this.InvokeNextWorker(work, filters, thisFilterIndex);
            }
            finally
            {
                ExecutionContext.__SetThreadLevelCallContext(original);
            }
        }
Ejemplo n.º 2
0
        public void Test002()
        {
            //---- 1st host
            var start = Guid.NewGuid();

            ExecutionContext.__SetThreadLevelCallContext(new CodeCallFlow(start, callerPort: "my-entrypoint-A"));


            var flow       = DistributedCallFlow.Start(NOPApplication.Instance, "My call flow");
            var jsonHeader = flow.ToHeaderValue();

            flow.See();
            Aver.AreEqual(start, flow.ID);
            Aver.AreEqual("my-entrypoint-A", flow.CallerPort);
        }
Ejemplo n.º 3
0
        public void Test001()
        {
            //---- 1st host
            var start = Guid.NewGuid();

            ExecutionContext.__SetThreadLevelCallContext(new CodeCallFlow(start, callerPort: "my-entrypoint"));


            var flow = DistributedCallFlow.Start(NOPApplication.Instance, "My call flow");

            Aver.AreEqual(start, flow.ID);
            Aver.AreEqual(1, flow.Count);

            var jsonHeader = flow.ToHeaderValue();

            //SEND OVER HTTP -------------------------
            ExecutionContext.__SetThreadLevelCallContext(null);
            //--------------------------------------------------

            //---- 2nd host
            flow = DistributedCallFlow.Continue(NOPApplication.Instance, jsonHeader);

            Aver.AreEqual(start, flow.ID);
            Aver.AreEqual(2, flow.Count);

            jsonHeader = flow.ToHeaderValue();
            //SEND OVER HTTP -------------------------
            ExecutionContext.__SetThreadLevelCallContext(null);
            //--------------------------------------------------

            //---- 3nd host
            flow = DistributedCallFlow.Continue(NOPApplication.Instance, jsonHeader);

            Aver.AreEqual(start, flow.ID);
            Aver.AreEqual(3, flow.Count);

            var json = flow.ToJson(JsonWritingOptions.PrettyPrint);

            "start is: {0} \n {1} is {2} chars".SeeArgs(start, json, json.Length);
        }
Ejemplo n.º 4
0
        public async Task Test003_ExecuteBlockAsync()
        {
            //---- 1st host
            var start = Guid.NewGuid();
            var flow  = DistributedCallFlow.Start(NOPApplication.Instance, "Flow A", start, "Ryazanov", callerPort: "TV");

            //later in flow....
            await DistributedCallFlow.ExecuteBlockAsync(NOPApplication.Instance, (innerFlow) => {
                innerFlow.See();

                innerFlow.ToHeaderValue().See();

                Aver.AreSameRef(innerFlow, ExecutionContext.CallFlow);

                Aver.AreEqual(start, flow.ID);
                Aver.AreEqual(start, innerFlow.ID);
                Aver.AreEqual("TV", flow.CallerPort);
                Aver.AreEqual("TV", innerFlow.CallerPort);

                Aver.AreEqual("Ryazanov", flow.DirectorName);
                Aver.AreEqual("Ryazanov", innerFlow.DirectorName);

                Aver.AreEqual(2, innerFlow.Count);

                Aver.AreEqual("Ryazanov", innerFlow[0].DirectorName);
                Aver.AreEqual("Dovzhenko", innerFlow[1].DirectorName);

                Aver.AreSameRef(innerFlow[0], innerFlow.EntryPoint);
                Aver.AreSameRef(innerFlow[1], innerFlow.Current);

                Aver.AreEqual(start, innerFlow.EntryPoint.ID);
                Aver.AreNotEqual(start, innerFlow.Current.ID);

                return(Task.FromResult(0));
            }, "Continuation", directorName : "Dovzhenko", callerAgent : "mytezt003");//, callerPort: "VCR");

            Aver.AreSameRef(flow, ExecutionContext.CallFlow);
        }