C# 通过MSMQ的MassTransit不起作用,为什么?
这是我的MassTransit代码 用户控制台应用程序:C# 通过MSMQ的MassTransit不起作用,为什么?,c#,masstransit,C#,Masstransit,这是我的MassTransit代码 用户控制台应用程序: namespace ConsoleSubscriber { class Program { static void Main(string[] args) { Console.WriteLine("set up a subscriber"); Bus.Initialize(config => {
namespace ConsoleSubscriber
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("set up a subscriber");
Bus.Initialize(config =>
{
config.UseMsmq();
config.VerifyMsmqConfiguration();
config.UseMulticastSubscriptionClient();
config.UseControlBus();
config.ReceiveFrom("msmq://localhost/test_end");
config.Subscribe(s => s.Instance(new Consumer()).Permanent());
});
Console.Read();
}
}
public class Consumer : Consumes<Message>.All
{
public void Consume(Message message)
{
Console.WriteLine("start consuming message");
if (string.IsNullOrEmpty(message.Ids))
{
Console.WriteLine("no ids");
}
else
{
Console.WriteLine("ids are " + message.Ids);
}
}
}
}
namespace ConsolePublisher
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("start publishing");
// initialize bus
Bus.Initialize(config =>
{
config.UseMsmq();
config.VerifyMsmqConfiguration();
config.UseMulticastSubscriptionClient();
config.UseControlBus();
config.ReceiveFrom("msmq://localhost/test_queue");
});
Bus.Instance.Publish(new Message());
Console.WriteLine("Message sent 1");
var msg2 = new Message() { Ids ="1,2,3,4" };
Bus.Instance.Publish(msg2);
Console.WriteLine("Message sent 2");
Console.Read();
}
}
}
发布者控制台应用程序:
namespace ConsoleSubscriber
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("set up a subscriber");
Bus.Initialize(config =>
{
config.UseMsmq();
config.VerifyMsmqConfiguration();
config.UseMulticastSubscriptionClient();
config.UseControlBus();
config.ReceiveFrom("msmq://localhost/test_end");
config.Subscribe(s => s.Instance(new Consumer()).Permanent());
});
Console.Read();
}
}
public class Consumer : Consumes<Message>.All
{
public void Consume(Message message)
{
Console.WriteLine("start consuming message");
if (string.IsNullOrEmpty(message.Ids))
{
Console.WriteLine("no ids");
}
else
{
Console.WriteLine("ids are " + message.Ids);
}
}
}
}
namespace ConsolePublisher
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("start publishing");
// initialize bus
Bus.Initialize(config =>
{
config.UseMsmq();
config.VerifyMsmqConfiguration();
config.UseMulticastSubscriptionClient();
config.UseControlBus();
config.ReceiveFrom("msmq://localhost/test_queue");
});
Bus.Instance.Publish(new Message());
Console.WriteLine("Message sent 1");
var msg2 = new Message() { Ids ="1,2,3,4" };
Bus.Instance.Publish(msg2);
Console.WriteLine("Message sent 2");
Console.Read();
}
}
}
当我运行这两个控制台应用程序时,消费者似乎没有接收到消息。有什么想法吗
干杯 在调用publish之前,请尝试进入睡眠状态。多播订阅可能需要一些时间才能配置,因为这两个实例正在相互通信。还要确保在发布者之前启动消费者。同时替换
config.Subscribe(s=>s.Instance(newconsumer()).Permanent())代码>与config.Subscribe()一起使用代码>可能会有帮助
还有其他路由方法可以在进程重新启动之间保留订阅数据,只要您继续前进。我将开始考虑使用订阅服务、静态路由,或者在获得此方面的句柄后仅使用RabbitMQ 谢谢,是的。问题是时间,我已经设法在总线初始化之后为sub和pub设置了睡眠。现在sub接收到消息。@Travis您建议的最小睡眠时间是多少毫秒?这在某种程度上取决于您的网络配置和延迟,但大约500-1000毫秒的时间应该足以让多播完成这项任务。(大约1/2到1秒钟)。很好,在检查我的代码半天之后,总线初始化后的一个线程。睡眠神奇地解决了发布问题。