我试图绕过MassTransit和RabbitMQ并排队(第1天)
我的问题是"消费者是否有必要排队在MT工作.我问的原因是因为我首先创建了Domain和Producer,但我没有在RabbitMQ管理窗口中看到任何排队的项目."
创建消费者队列后,我可以看到消息排队.
根据我的理解,Producer永远不会意识到消费者,那么为什么MassTransit需要消费者队列来启动消息发布?
制片人
using MassTransit;
namespace Producer
{
class Program
{
static void Main(string[] args)
{
Bus.Initialize(sbc =>
{
sbc.UseRabbitMq(); //1
sbc.UseControlBus();
sbc.EnableMessageTracing();
sbc.EnableRemoteIntrospection();
sbc.ReceiveFrom("rabbitmq://localhost/MT.Producer");
sbc.UseControlBus();
});
Bus.Instance.Publish(new NewOrderMessage { OrderName = "Hello World" });
}
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MassTransit;
using Topshelf;
namespace Consumer
{
class Program
{
static void Main(string[] args)
{
Bus.Initialize(sbc =>
{
sbc.UseRabbitMq();
sbc.UseRabbitMqRouting();
sbc.ReceiveFrom("rabbitmq://localhost/MT.ConsumerService");
});
var cfg = HostFactory.New(c =>
{
c.SetServiceName("MT.ConsumerService");
c.SetDisplayName("MT.ConsumerService");
c.SetDescription("MT.ConsumerService");
//c.BeforeStartingServices(s => {});
c.Service<ConsumerService>(a =>
{
a.ConstructUsing(service => new ConsumerService());
a.WhenStarted(o => o.Start());
a.WhenStopped(o => o.Stop());
});
});
try
{
cfg.Run();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
消息
namespace Domain
{
public class NewOrderMessage
{
public NewOrderMessage()
{
OrderId = Guid.NewGuid();
}
public Guid OrderId { get; set; }
public string OrderName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
消费者服务
namespace Consumer
{
class ConsumerService
{
readonly IServiceBus _bus;
public ConsumerService()
{
_bus = Bus.Instance;
}
public void Start()
{
_bus.SubscribeHandler<NewOrderMessage>(CreateOrder);
Console.WriteLine("Starting....");
}
public void Stop()
{
Console.WriteLine("Stopping....");
}
public void CreateOrder(NewOrderMessage command)
{
Console.WriteLine("Creating Order: {0} with Id: {1}", command.OrderName, command.OrderId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码是使用Web上的示例创建的.
编辑还想添加所有名称空间是不同的项目Domain Producer Consumer
问候,
损伤
关于masstransit-discus的以下答案对我有帮助.
来自Google Group masstransit-discuss
... MassTransit的实际情况是,您实际上并未发布到队列,而是发布到交换机,然后将其设置为将该消息传递给已在该交换机上订阅消息的其他队列.由于您没有任何消费者,因此没有人对您的消息表示任何兴趣,因此它将被忽略.
所以只需设置一个消费者,让它听"rabbitmq:// localhost/B".第一次运行它时,它将在它们之间创建必要的交换和链接,并且您的消息将被传递到名为B的队列.
安德斯
总线是所有交换,队列和服务的集合.当您在公交车上发布时,在该公交车上注册的所有消费者都将收到该公交车.
交换是实现这项工作的RabbitMQ实现.
特拉维斯
| 归档时间: |
|
| 查看次数: |
1161 次 |
| 最近记录: |