gpt4 book ai didi

servicebus - REBUS 在队列中发送消息,并在另一个应用程序中接收

转载 作者:行者123 更新时间:2023-12-02 03:21:19 26 4
gpt4 key购买 nike

我想使用 rebus 实现以下场景。我正在创建发件人应用程序和一个接收应用程序。会有一个类(class)假设

   public class GetPersonRequest
{
public int Id { get; set; }
public string Name { get; set; }
}

public class GetPersonResponse
{
public int Id { get; set; }
public string Name { get; set; }
}

我将把这个类对象与值一起发送到队列中。并希望在接收器中显示这些值。如何实现这一目标?

发送方代码如下:
  static void Main(string[] args)
{
GetPersonRequest objGetPersonRequest = new GetPersonRequest();
objGetPersonRequest.Id = 12;
objGetPersonRequest.Name = "Kumar";

using (var activator = new BuiltinHandlerActivator())
{
activator.Register(() => new PrintName());

var bus = Configure.With(activator)
.Logging(l => l.None())
.Transport(t => t.UseMsmq("rebus-application.input"))
.Routing(r => r.TypeBased().Map<GetPersonRequest>("rebus.application.output"))
.Start();

bus.Send(objGetPersonRequest);

Console.WriteLine("Press enter to quit");
Console.ReadLine();
}

在另一个控制台应用程序中这样的接收器代码:
   static void Main(string[] args)
{
using (var activator = new BuiltinHandlerActivator())
{
activator.Register(() => new PrintName());

var bus = Configure.With(activator)
.Logging(l => l.None())
.Transport(t => t.UseMsmq("rebus-application.output"))
.Routing(r => r.TypeBased().Map<GetPersonResponse>("rebus-application.input"))
.Start();


Console.WriteLine("Press enter to quit");
Console.ReadLine();
}
}

class PrintName : IHandleMessages<GetPersonResponse>
{
public async Task Handle(GetPersonResponse objGetPersonResponse)
{
Console.WriteLine("RebusDetails Name is {0}", objGetPersonResponse.Name);
}
}

如何实现这一目标?

最佳答案

建议你看看the request/reply sample来自 RebusSamples repository - 它显示了进行正确请求/回复所需的配置。

通过快速浏览您的代码,我可以看到以下问题/误解:

  • Rebus 方法是异步的,因此 bus.Send(objGetPersonRequest)将在另一个线程上执行,你不会知道它是否失败 - 总是 await bus.Send(...)bus.Send(...).Wait()
  • 在许多情况下,只有“客户端”(*)应该有端点映射 - 在你的情况下,你应该映射 GetPersonRequest (或者可能是包含它的整个程序集?)到 rebus.application.output ,然后执行 await bus.Reply(new GetPersonResponse(...))在处理程序中 - 这样,“服务器”(*) 将没有任何依赖项

  • 此外 - 这可能是一个细节,但我认为随着时间的推移,它会导致更好的理解和更容易的沟通:
  • 没有“输出队列”这样的东西——所有队列都是端点的输入队列,将它作为输入队列——因此,我认为名称 rebus-application.output误导
  • 我建议您将队列名称更改为更好地识别每个端点的名称,例如由于您的服务器似乎能够返回一个人的详细信息,您可以将其命名为 masterdata , crm等,可能后缀 .input如果你例如希望每个端点都有一个错误队列(例如 masterdata.inputmasterdata.error )。

  • 我希望这是有道理的 :)

    (*) 根据我的经验,在端点的客户端和服务器角色之间有一个非常明确的区别是有益的,其中客户端是没有(或很少) afferent couplings 的端点。 ,这允许它们轻松添加/删除/更改,并且服务器是具有更多传入耦合的端点。

    当您 await bus.Reply(...)从服务器,它允许发件人保持客户端,而不是在其自己的配置中的任何地方配置其端点地址。

    关于servicebus - REBUS 在队列中发送消息,并在另一个应用程序中接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140393/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com