2012-08-09 81 views
4

我正在寻找使用MassTransit将事件从一个进程发布到关注该事件的所有其他进程。在我的环境中,订阅该事件的多个进程可能在同一个框上运行。如何在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"); 
     } 
    } 
} 

如果我运行这个C#应用程序的多个实例,只有一个实例接收消息,但我需要所有的实例来接收它。这种行为与队列的经典概念是一致的,所以我很好。

我在看的是我是否可以使用MSMQ/MassTransit发布所有订阅者都会收到的消息,而不是只有一个订阅者出列它,而其他订阅者没有收到它。也许我正在尝试使用锤子,而我需要一把画笔?

只是为了清楚这里,我没有看到为不同类型的消息共享单个队列,我正在使用MT为特定类型的消息设置“peer-to-peer”pub-sub。和MSMQ。

+0

对此的任何解决方案。我正在开发一款应用程序,要求msg发送给所有人,每个人都可以发布消息。 – 2014-09-29 09:58:16

+2

@tonginbox - 我们结束了使用RabbitMQ和“扇出”策略,每个消费者都有自己的队列,发布到交换机的消息被复制到所有消息中。 – 2014-09-30 12:16:01

回答

2

我不确定锤子或画笔,但我认为你正朝着正确的方向前进。

首先,总线的每个实例都需要它自己的队列来读取。如果您正在运行同一程序的多个版本,请确保它们正在读取不同的队列。尝试从同一队列中读取会导致Bad Stuff(TM)。

如果您有更多问题,请加入邮件列表。 https://groups.google.com/forum/#!forum/masstransit-discuss

发布时,all consumers should recieve the message一旦被订阅。启动时,订阅数据可能需要一两秒才能传递到所有进程。

我也建议看看RabbitMQ。除非你绝对需要DTC,否则RabbitMQ是一个更强大的消息传递平台。

+0

在运行示例应用程序(在Windows 7上)之前,我安装了MSMQ,但未配置任何队列。当我运行上面的应用程序和私人队列创建。我会在邮件列表中提交这个问题,但我相信MT会创建这些队列。 – 2012-08-09 15:55:25

+0

你可能对私人队列是正确的,它是MT不支持的公共队列。 – Travis 2012-08-10 11:51:00

相关问题