MassTransit 学习记录(二) Request/Response

第一章里,我们已经简单的使用了MassTransit的推送、接收功能,但目前都还只是单方面的推送、接收,实际场景中,我们更多的是会碰到需要返回值的情况,而这一章,就是讲述下在MassTransit中如何进行Request、Response。

MassTransit中提供接口IRequestClient<TRequest, TResponse>来定义Request/Response模式,其具体实现类为MessageRequestClient<TRequest, TResponse>。

现在我们来修改一下上篇中的代码,因为上篇只是一个简单的入门例子,所以将推送、接收代码都写在了一个控制台程序里面,这里为了与更符合真实情况,将新建一个客户端控制台,其代码也是之前的代码复制过来,删除接收部分后再稍作调整、并加入Request/Response部分

            var rbBus = Bus.Factory.CreateUsingRabbitMq(configure =>
            {
                var host = configure.Host(new Uri("rabbitmq://192.168.5.136/"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });
            });
            using (rbBus.Start())
            {
                string text = string.Empty;
                do
                {
                    text = Console.ReadLine();
                    string endPoint = null;
                    if (text.Contains(":"))//设定endpoint与message通过:分割
                    {
                        var tmp = text.Split(':');
                        endPoint = tmp[0];
                        text = tmp[1];
                    }
                    if (string.IsNullOrWhiteSpace(endPoint))
                    {
                        
                        rbBus.Publish<IMessageContract>(new { Value = text });
                    }
                    else
                    {
                        var uri = new Uri($"rabbitmq://192.168.5.136/{endPoint}");
                        if (endPoint == "callback")
                        {//设定callback为request/response
                            MessageRequestClient<MessageContract, MessageContract> client =
                                new MessageRequestClient<MessageContract, MessageContract>(rbBus, uri, TimeSpan.FromSeconds(10));
                            var response = client.Request(new MessageContract { Value = text }, default(CancellationToken)).Result;
                            Console.WriteLine("Get Response:" + response.Value);
                        }
                        else
                        {
                            var point = rbBus.GetSendEndpoint(uri).Result;
                            point.Send<IMessageContract>(new { Value = $"Send To {endPoint} { text}" });
                        }
                    }
                }
             }
上面的代码中,我们只需关注callback部分的代码,可以注意到,这里用了同一个类MessageContract而不是接口来作为Request和Response的契约,这是因为与单向的推送、接收不同, IRequestClient的Request方法设置了泛型约束,而且只提供了一个方法,so……契约定义成接口的方式在这里被打脸了,不知道作者以后会不会修正这里……

看完客户端代码,现在我们在原来的代码里面加入endPoint为callback的接收代码

                configure.ReceiveEndpoint(host, "callback", e =>
                {
                    e.Handler<MessageContract>(async context =>
                    {
                        await Task.Run(() =>
                       {
                           Console.WriteLine("Received By callback:{0}", context.Message.Value);
                           context.Respond(new MessageContract { Value = "CallBack Message:" + context.Message.Value });
                       });
                    });
                });
注意这里为了方便起见,采用了handler的方式,在这里简单的通过Respond<T>方法来实现消息的反馈,除了这个同步方法外,MassTransit 还提供了一系列的异步方法,读者也可以自行尝试。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值