我刚刚开始使用MassTransit,并且找不到任何适合初学者的文档。 我确实在http://looselycoupledlabs.com/2014/06/masstransit-publish-subscribe-example/找到了一些示例代码,它显示了使用RabbitMQ的简单MassTransit发布/订阅示例
但对于我的公司,我需要使用MSMQ。 所以我删除了RabbitMQ引用:
x.UseRabbitMq();
x.ReceiveFrom("rabbitmq://localhost/MtPubSubExample_" + queueName);
并将其更改为使用MSMQ:
x.UseMsmq();
x.ReceiveFrom("msmq://localhost/MtPubSubExample_" + queueName);
启动订阅者和发布者时没有错误,我可以在发布者处输入消息但是他们似乎没有到达订阅者,消费代码从未被调用。
配置:
namespace Configuration
{
public class BusInitializer
{
public static IServiceBus CreateBus(string queueName, Action<ServiceBusConfigurator> moreInitialization)
{
Log4NetLogger.Use();
var bus = ServiceBusFactory.New(x =>
{
x.UseMsmq();
x.ReceiveFrom("msmq://localhost/MtPubSubExample_" + queueName);
moreInitialization(x);
});
return bus;
}
}
}
出版商:
static void Main(string[] args)
{
var bus = BusInitializer.CreateBus("TestPublisher", x => { });
string text = "";
while (text != "quit")
{
Console.Write("Enter a message: ");
text = Console.ReadLine();
var message = new SomethingHappenedMessage() { What = text, When = DateTime.Now };
bus.Publish<SomethingHappened>(message, x => { x.SetDeliveryMode(MassTransit.DeliveryMode.Persistent); });
}
bus.Dispose();
}
订户:
static void Main(string[] args)
{
var bus = BusInitializer.CreateBus("TestSubscriber", x =>
{
x.Subscribe(subs =>
{
subs.Consumer<SomethingHappenedConsumer>().Permanent();
});
});
Console.ReadKey();
bus.Dispose();
}
未被调用的消费者代码:
class SomethingHappenedConsumer : Consumes<SomethingHappened>.Context
{
public void Consume(IConsumeContext<SomethingHappened> message)
{
Console.Write("TXT: " + message.Message.What);
Console.Write(" SENT: " + message.Message.When.ToString());
Console.Write(" PROCESSED: " + DateTime.Now.ToString());
Console.WriteLine(" (" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + ")");
}
}
我还以为我可以看到消息存储在msmq中,但私有队列是空的。
我现在正在敲我的头2天,一定是想念一些明显的东西;非常感谢任何帮助。
我的环境:Windows 8.1教授与VS 2013教授
答案 0 :(得分:2)
这个难题的缺失部分是订阅分发 - 这是跟踪消费者注册什么消息并路由消息的组件。
正如docs所说:
在本地总线上创建订阅后,就会显示此信息 需要在您的所有不同总线实例之间共享 应用网络。
虽然路由数据是相同的,但这些信息如何传达给所有人 根据您的传输配置,节点的数量会有所不同。
随着页面继续解释,对于MSMQ,您有两个选择:
多播是only really meant for development and not for production。请注意,没有永久订阅和messages can be lost during startup
订阅服务(又名MassTransit.RuntimeServices)为not distributed with NuGet,因此您需要从源代码中查找二进制文件或编译。它作为Windows服务运行,需要一个数据库来跟踪订阅。
我相信在运行RabbitMQ或Azure服务总线时不需要这些,这是即将推出的3.0版本支持的传输(在最新版本的2.x中支持Rabbit MQ比MSMQ更多,而且版本3支持MSMQ支持)