And*_*ken 6 c# masstransit servicebus publish-subscribe
我正在考虑使用MassTransit将事件从一个进程发布到关注该事件的所有其他进程.在我的环境中,订阅该事件的多个进程可以在同一个盒子上运行.
基于MassTransit的示例代码,这里有一个非常简单的概念验证,它不会尝试处理多播(流程也将分布在许多机器上).将下面的"消息"视为"事件",并且我希望此进程的每个实例都获取该消息:
using System;
using MassTransit;
namespace BasicPubSub
{
public class Message
{
public String Text { get; set; }
}
public class Program
{
static void Main(string[] args)
{
//initialize the bus
var bus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq();
//cause the DTC and MSMQ to get installed/fixed if needed.
sbc.VerifyMsDtcConfiguration();
sbc.VerifyMsmqConfiguration();
//sbc.UseMulticastSubscriptionClient();//Doesn't behave for a private queue.
sbc.ReceiveFrom("msmq://localhost/test_queue");
//Listen for interesting events.
sbc.Subscribe(subs =>
{
subs.Handler<Message>(msg => Console.WriteLine(msg.Text));
});
});
//stay open until the user types "exit"
var message = "";
do
{
message = Console.ReadLine();
//broadcast the message
bus.Publish(new Message { Text = message });
} while (message != "exit");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行此C#应用程序的多个实例,则只有一个实例接收消息,但我需要所有实例来接收它.这种行为与队列的经典概念一致,所以我对此很好.
我想知道的是我是否可以使用MSMQ/MassTransit发布所有订阅者将收到的消息,而不是只有一个订阅者将其出列而其他用户没有收到它.也许我正在尝试使用锤子,我需要画笔?
为了清楚这一点,我不打算为不同类型的消息共享一个队列,我正在寻找使用MT和MSMQ为特定类型的消息设置"peer-to-peer"pub-sub.
我不确定锤子或画笔,但我认为你正朝着正确的方向前进。
首先,总线的每个实例都需要有自己的队列来读取。如果您正在运行同一程序的多个版本,请确保它们正在读取不同的队列。尝试从同一队列中读取会导致 Bad Stuff(TM)。
如果您有更多问题,请加入邮件列表。https://groups.google.com/forum/#!forum/masstransit-discuss。
发布时,所有消费者在订阅后都应该收到消息。启动时,订阅数据可能需要一两秒才能传递到所有进程。
我还建议看看 RabbitMQ。除非您绝对需要 DTC,否则 RabbitMQ 是一个更强大的消息传递平台。