Search code examples
.net-corerabbitmqmasstransitrouting-slipmasstransit-courier

send data to RoutingSlipCompleted consume method from activity


I have some data in activity which I want to get it in RoutingSlipCompleted consume method. I know we can send data with CompletedWithVariables from a activity to b activity. But I was wondering how it is possible to get data from activity in RoutingSlipCompleted. so this is my activity:

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
            }));
        }

so by the following line of codes I can get data in CallSuccessActivity:

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

so I can get this data here:

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();
        }
    }

I want to get this iModel.CheckInventoryCustomActionResult in 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();
            
           
        }

Solution

  • Instead of putting the value into the activity arguments, add it as a variable:

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