Абмен CorrelationHandle паміж двума карыстацкімі дзейнасці з выкарыстаннем аргументаў

Я строй уласных дзеянняў, першая дзейнасць, якая змяшчае ReceiveSendReply дзейнасць з некаторымі іншымі відамі дзейнасці. У гэтым практыкаванні я ствараю асобнік працоўнага працэсу. Я хачу, каб прызначыць Intialized CorrelationHandle да OutArgument. Якія будуць прызначаныя знешніх сумесна varriable.

У іншай дзейнасці, у мяне ёсць іншая дзейнасць ReceiveSendReply, якая будзе аднаўляць асобнік створанага вышэй названай дзейнасцю. У другой дзейнасці я маю CorrelationHandle як InArgument. Я прысвоіць гэты InArgument са знешнім агульным correlationHandle varriable.

Калі я выкананне гэтай службы дакументазвароту, першая аперацыя выконваецца без якога-небудзь пытання і запоўніць ключ карэляцыі і я атрымліваю, што ключ карэляцыі ў адказ. Калі я ўпэўнены, выкананне другі актыўнасці, выкарыстоўваючы атрыманы ключ карэляцыі, сэрвіс вяртанне з наступным выключэннем:

«Пакаранне смерцю ў InstancePersistenceCommand была перапыненая, бо ключ асобніка" 45f99690-2829-3126-0782-99033212633c "не быў звязаны з асобнікам. Гэта можа адбыцца, паколькі асобнік або ключ быў ачышчаны, ці таму, што ключ ня дзейнічае. ключ можа быць несапраўдным, калі паведамленне ён быў створаны з быў адпраўлены ў няправільны час або ўтрымліваюцца няправільныя дадзеныя карэляцыі «.

Я хачу ведаць, як дзяліць CorrelationHandle паміж двума карыстацкімі дзейнасці з выкарыстаннем OutArgument і InArguments?

public sealed class Create : Activity
{
    public Create()
    {
        Implementation = new Func(CreateBody);
    }

    public string ServiceContract { get; set; }

    public string Operation { get; set; }

    [RequiredArgument]
    public OutArgument CorrelationHandle { get; set; }

    Activity CreateBody()
    {
       //variables declaration. 
        var requestContent = new Variable();
        var operationResponseParam = new Variable();
        var correlationKey = new Variable();
        var correlationHandle = new Variable();

        Receive receiveRequest;

        return new Sequence
        {
            Variables = { correlationHandle, correlationKey }, 
            Activities = 
            {
                {receiveRequest = new Receive()
                {
                    ServiceContractName = ServiceContract,
                    OperationName = Operation,
                    CanCreateInstance = true,
                    Content = new ReceiveMessageContent
                    {
                        Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
                    },
                }},

                new Assign
                {
                    To = new OutArgument(ctx => correlationKey.Get(ctx)),
                    Value = new InArgument(ctx => Guid.NewGuid().ToString())
                },

                new Assign
                {
                    To = new ArgumentReference("AppData"),
                    Value = new InArgument(ctx =>appData.Get(ctx))
                },

                new Assign
                {
                    To = new OutArgument(ctx => operationResponseParam.Get(ctx)),
                    Value = new InArgument
                    {
                        Expression = new BuildResponse()
                        {
                            CorrelationKey = new InArgument(correlationKey),
                        }
                    }
                },

                new SendReply
                {
                    Request = receiveRequest,
                    Content = new SendMessageContent
                    {
                        Message = new InArgument(ctx => operationResponseParam.Get(ctx))
                    },

                    CorrelationInitializers =
                    {
                        new QueryCorrelationInitializer
                        {
                            CorrelationHandle =  new InArgument(correlationHandle),
                            MessageQuerySet = new MessageQuerySet
                            {
                                {
                                    "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")
                                }
                            }
                        }
                    }
                },

                new Assign
                {
                    To = new ArgumentReference("CorrelationHandle"),
                    Value = new InArgument(ctx =>correlationHandle.Get(ctx))
                },
            }
        };
    }
}


public sealed class Wait : Activity
{
    public Wait()
    {
        Implementation = new Func(CreateBody);
    }

    public string ServiceContract { get; set; }

    public string Operation { get; set; }

    [RequiredArgument]
    public InArgument CorrelationHandle { get; set; }

    Activity CreateBody()
    {
       //variables declaration. 

        var operationRequestParam = new Variable();
        var operationResponseParam = new Variable();
        var correlationHandle = new Variable();
        Receive receiveRequest;

        return new Sequence
        {
            Variables = { correlationHandle },
            Activities =
            {
                new Sequence
                {
                    Variables = {operationRequestParam, operationResponseParam },

                    Activities = 
                    {
                        {receiveRequest =new Receive()
                        {
                            ServiceContractName = ServiceContract,
                            OperationName = Operation,
                            CanCreateInstance = false,
                            CorrelatesWith = new InArgument(ctx => CorrelationHandle.Get(ctx)),
                            CorrelatesOn = new MessageQuerySet
                            {
                                { "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")}
                            },

                            //parameters for receive
                            Content = new ReceiveMessageContent
                            {
                                Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
                            },
                        }},


                        new Assign
                        {
                            To = new OutArgument(operationResponseParam),
                            Value = new InArgument
                            {
                                Expression = new BuildResponse()
                                {
                                    ApplicationData = new InArgument(ctx => appData.Get(ctx)),
                                }
                            }
                        },

                        new SendReply
                        {
                            Request = receiveRequest,
                            Content = new SendMessageContent
                            {
                                Message = new InArgument(ctx => operationResponseParam.Get(ctx))
                            }
                        },
                    }
                },
            }
        };
    }
}
0
Вам сапраўды трэба рэалізаваць карыстацкае ReceiveSendReply дзейнасці? Чаму б вам не проста выкарыстоўваць тыя, якія прыходзяць з ВФ, ствараць больш простыя дзеянні, каб выканаць логіку вам трэба, і карэлююць з нармальнымі варыянтамі карэляцыйнага ReceiveSendReply убудаванай у дзейнасці?
дададзена аўтар Gabe Thorns, крыніца

1 адказы

Мы павінны выкарыстоўваць ручку як InArgument, і аб'ект refereing ручкі будзе зменены InitializeCorrelation. Так што ў маіх абодвух відаў дзейнасці я павінен выкарыстоўваць InArgument замест OutArgument ў першым і InArgument у другім.

public sealed class Create : Activity
{
    public Create()
    {
        Implementation = new Func(CreateBody);
    }

    public string ServiceContract { get; set; }

    public string Operation { get; set; }

    [RequiredArgument]
    public InArgument CorrelationHandle { get; set; }

    Activity CreateBody()
    {
       //variables declaration. 
        var operationRequestParam = new Variable();
        var appData = new Variable();
        var operationResponseParam = new Variable();
        var correlationKey = new Variable();


        Receive receiveRequest;

        return new Sequence
        {
            Variables = { correlationKey }, 
            Activities = 
            {
                {receiveRequest = new Receive()
                {
                    ServiceContractName = ServiceContract,
                    OperationName = Operation,
                    CanCreateInstance = true,
                    //parameters for receive
                    Content = new ReceiveMessageContent
                    {
                        Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
                    },
                }},

               //Assign a unique identifier to the correlation key.
                new Assign
                {
                    To = new OutArgument(ctx => correlationKey.Get(ctx)),
                    Value = new InArgument(ctx => Guid.NewGuid().ToString())
                },

                new Assign
                {
                    To = new OutArgument(ctx => operationResponseParam.Get(ctx)),
                    Value = new InArgument
                    {
                        Expression = new BuildResponse()
                        {
                            CorrelationKey = new InArgument(correlationKey),
                        }
                    }
                },

                new SendReply
                {
                    Request = receiveRequest,
                    Content = new SendMessageContent
                    {
                        Message = new InArgument(ctx => operationResponseParam.Get(ctx))
                    },

                    CorrelationInitializers =
                    {
                        new QueryCorrelationInitializer
                        {
                            CorrelationHandle =  new InArgument(ctx => CorrelationHandle.Get(ctx)),
                            MessageQuerySet = new MessageQuerySet
                            {
                                {
                                    "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")
                                }
                            }
                        }
                    }
                },
            }
        };
    }
}

public sealed class Wait : Activity
{
    static Wait()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        builder.AddCustomAttributes(typeof(Wait), "EscalationData", new EditorAttribute(typeof(EscalationDataEditor), typeof(DialogPropertyValueEditor)));
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }

    public Wait()
    {
        Implementation = new Func(CreateBody);
    }

    public EscalationInfoList EscalationData { get; set; }

    public string ServiceContract { get; set; }

    public string Operation { get; set; }

    [RequiredArgument]
    public InArgument CorrelationHandle { get; set; }

    Activity CreateBody()
    {
       //variables declaration. 
        var appData = new Variable();
        var operationRequestParam = new Variable();
        var operationResponseParam = new Variable();

        Receive receiveRequest;

        return new Sequence
        {
            Activities =
            {
               new Sequence
               {
                    Variables = {operationRequestParam, operationResponseParam },

                    Activities = 
                    {
                        {receiveRequest =new Receive()
                        {
                            ServiceContractName = ServiceContract,
                            OperationName = Operation,
                            CanCreateInstance = false,
                            CorrelatesWith = new InArgument(ctx => CorrelationHandle.Get(ctx)),
                            CorrelatesOn = new MessageQuerySet
                            {
                                { "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")}
                            },

                            //parameters for receive
                            Content = new ReceiveMessageContent
                            {
                                Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
                            },
                        }},

                        new SendReply
                        {
                            Request = receiveRequest,
                            Content = new SendMessageContent
                            {
                                Message = new InArgument(ctx => operationResponseParam.Get(ctx))
                            }
                        },
                    }
                },
            }
        }
    }
}
1
дададзена