从 Activity 发送数据到 RoutingSlipCompleted 使用方法

问题描述 投票:0回答:1

我在活动中有一些数据,我想在 RoutingSlipCompleted 使用方法中获取它。我知道我们可以使用 CompletedWithVariables 将数据从活动发送到活动 b。但我想知道如何从 RoutingSlipCompleted 中的活动获取数据。这就是我的活动:

public class CheckInventoryActivity : IActivity<ICheckInventoryRequest, CheckInventoryRequestCompensate>
    {
        private readonly IInventoryService _inventoryService;
        private readonly IEndpointNameFormatter _formatter;

        public CheckInventoryActivity(IInventoryService inventoryService, IEndpointNameFormatter formatter)
        {
            _inventoryService = inventoryService;
            _formatter = formatter;
        }
        public async Task<ExecutionResult> Execute(ExecuteContext<ICheckInventoryRequest> context)
        {
            CheckInventoryRequest model = new CheckInventoryRequest()
            {
                PartCode = context.Arguments.PartCode
            };
            var response = await _inventoryService.CheckInventory(model);
            var checkInventoryResponse = new CheckInventoryResponse()
            {
                PartCode = response.Data.PartCode ?? model.PartCode,
                Id = response.Data.Id ?? 0,
                InventoryCount = response.Data.InventoryCount ?? 0
            };

            var checkInventoryCustomActionResult = new CustomActionResult<CheckInventoryResponse>()
            {
                Data = checkInventoryResponse,
                IsSuccess = true,
                ResponseDesc = "success",
                ResponseType = 0
            };
            var result = response.IsSuccess;
            if (!result)
                return context.CompletedWithVariables<CheckInventoryRequestCompensate>(
                    new
                    {
                        Result = result,
                        LogDate = DateTime.Now,
                        MethodName = "CheckInventoryActivity",
                    }, new
                    {
                        Result = result,
                        LogDate = DateTime.Now,
                        MethodName = "CheckInventoryActivity",
                        CheckInventoryCustomActionResult = checkInventoryCustomActionResult
                    });
            var queueName = _formatter.ExecuteActivity<CallSuccessActivity, ISuccessRequest>();
            var uri = new Uri($"queue:{queueName}");
            return context.ReviseItinerary(x => x.AddActivity("CallSuccessActivity", uri, new
            {
                LogDate = DateTime.Now,
                MethodName = "CheckInventoryActivity",
                CheckInventoryCustomActionResult = checkInventoryCustomActionResult
            }));
        }

因此通过以下代码行我可以在

CallSuccessActivity
中获取数据:

return context.ReviseItinerary(x => x.AddActivity("CallSuccessActivity", uri, new
                {
                    LogDate = DateTime.Now,
                    MethodName = "CheckInventoryActivity",
                    CheckInventoryCustomActionResult = checkInventoryCustomActionResult
                }));
            }

所以我可以在这里获取这些数据:

public class CallSuccessActivity : IExecuteActivity<ISuccessRequest>
    {
        private readonly IRequestClient<ISuccessRequest> _requestClient;
        public CallSuccessActivity(IRequestClient<ISuccessRequest> requestClient)
        {
            _requestClient = requestClient;
        }
        public async Task<ExecutionResult> Execute(ExecuteContext<ISuccessRequest> context)
        {
            var iModel = context.Arguments;
            
            var model = new SuccessRequest()
            {
                LogDate = iModel.LogDate,
                MethodName = iModel.MethodName,
                CheckInventoryCustomActionResult = iModel.CheckInventoryCustomActionResult
            };
            
            //CustomActionResult< CheckInventoryResponse > CheckInventoryResponse = new ();
            var rabbitResult = await _requestClient.GetResponse<CustomActionResult<SuccessResponse>>(model);
            return context.Completed();
        }
    }

我想把这个

iModel.CheckInventoryCustomActionResult
放入
RoutingSlipCompleted

 public async Task Consume(ConsumeContext<RoutingSlipCompleted> context)
        {
            var requestId =
                context.Message.GetVariable<Guid?>(nameof(ConsumeContext.RequestId));
            var checkInventoryResponseModel = context.Message.Variables["CheckInventoryResponse"];
            var responseAddress =
                context.Message.GetVariable<Uri>(nameof(ConsumeContext.ResponseAddress));
            var request =
                context.Message.GetVariable< ICheckInventoryRequest > ("Model");
            
            throw new NotImplementedException();
            
           
        }
.net-core rabbitmq masstransit routing-slip masstransit-courier
1个回答
1
投票

不要将值放入活动参数中,而是将其添加为变量:

return context.ReviseItinerary(x =>
{
    x.AddActivity("CallSuccessActivity", uri, new
    {
        LogDate = DateTime.Now,
        MethodName = "CheckInventoryActivity"
    });
    
    x.AddVariable("CheckInventoryCustomActionResult", checkInventoryCustomActionResult);
});
© www.soinside.com 2019 - 2024. All rights reserved.