MassTransit 学习记录(二) Request/Response

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

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

现在我们来修改一下上篇中的代码,因为上篇只是一个简单的入门例子,所以将推送、接收代码都写在了一个控制台程序里面,这里为了与更符合真实情况,将新建一个客户端控制台,其代码也是之前的代码复制过来,删除接收部分后再稍作调整、并加入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(new { Value = text });
                    }
                    else
                    {
                        var uri = new Uri($"rabbitmq://192.168.5.136/{endPoint}");
                        if (endPoint == "callback")
                        {//设定callback为request/response
                            MessageRequestClient client =
                                new MessageRequestClient(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(new { Value = $"Send To {endPoint} { text}" });
                        }
                    }
                }
             }
上面的代码中,我们只需关注callback部分的代码,可以注意到,这里用了同一个类MessageContract而不是接口来作为Request和Response的契约,这是因为与单向的推送、接收不同, IRequestClient的Request方法设置了泛型约束,而且只提供了一个方法,so……契约定义成接口的方式在这里被打脸了,不知道作者以后会不会修正这里……

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

                configure.ReceiveEndpoint(host, "callback", e =>
                {
                    e.Handler(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方法来实现消息的反馈,除了这个同步方法外,MassTransit 还提供了一系列的异步方法,读者也可以自行尝试。

你可能感兴趣的:(MassTransit,C#)