在NServiceBus中发送SendOnly

Pet*_*röm 5 c# nservicebus

在创建NServiceBus SendOnly端点时,目的只是发射并忘记,即只发送一条消息,然后其他人将负责处理它.这似乎是我需要的东西.我不希望总线和系统处理消息之间的任何通信.系统"A"想要通知系统"B"某事.

那么SendOnly端点的创建如果非常简单,那么系统如何监听来自SendOnly端点的消息呢.

我正在尝试在命令行项目中设置一个侦听器来处理消息.消息被发送到队列但它们不会被系统"B"处理.

这是错误的方法吗?对于这种类型的功能,总线是否过度杀伤?

系统A:

public class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();

        var bus = Configure.With()
            .UnityBuilder(container)
            .JsonSerializer()
            .Log4Net()
            .MsmqTransport()
            .UnicastBus()
            .SendOnly();

        while(true)
        {
            Console.WriteLine("Send a message");
            var message = new Message(Console.ReadLine());
            bus.Send(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

系统B:

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();

        var bus = Configure.With()
            .UnityBuilder(container)
            .JsonSerializer()
            .Log4Net()
            .MsmqTransport()
            .UnicastBus()
            .LoadMessageHandlers()
            .CreateBus()
            .Start();

        Console.WriteLine("Waiting for messages...");

        while(true)
        {

        }
    }
}

public class MessageHandler : IHandleMessages<Message>
{
    public void Handle(Message message)
    {
        Console.WriteLine(message.Data);
    }
}

public class Message : IMessage
{
    public Message()
    {

    }

    public Message(string data)
    {
        Data = data;
    }

    public string Data { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

Tre*_*ley 5

在MessageEndpointMappings中,您需要按如下方式更新它:

  1. 将DLL替换为包含消息的程序集的名称(例如"消息")
  2. 将端点更改为系统B正在读取的队列的名称(您可以通过查看私有队列下的MSMQ管理单元来检查队列名称).
<add Messages="Messages" Endpoint="SystemB" />
Run Code Online (Sandbox Code Playgroud)

NServiceBus 3根据主机程序集的命名空间自动创建队列名称.

此外,您可能希望使用NServiceBus.Host来托管处理程序而不是您自己的控制台应用程序.