2017-10-17 84 views
0

我想创建一个队列与RabbitMq在哪里我会发送一些消息在一边,并在另一个应用程序接收。我'与下面的代码这样做:混淆Masstransit ReceiveFrom方法和消费者行为

return ServiceBusFactory.New(x => 
     { 
      var uriString = string.Format(@"rabbitmq://{0}/{1}/{2}?prefetch={3}", host, virtualHost, queueName, 
       prefetch < 1 ? 1 : prefetch); 
      x.UseRabbitMq(r => r.ConfigureHost(new MessageUrn(uriString), h => 
      { 
       h.SetUsername(user); 
       h.SetPassword(password); 
       h.SetRequestedHeartbeat(3); 

      })); 

      x.ReceiveFrom(uriString); 

      x.UseJsonSerializer<ServiceBusConfigurator>(); 

      f(x); 
     }); 

MessageUrn URI和ReceiveFrom应该有相同的URI,否则URI的ReceiveFrom方法规定确定公共汽车终点。但这意味着我的发布者也是同一队列的消费者。当没有接收者时,所有消息都进入queuename_error队列。当有接收器时,一切似乎都可以。

我在做什么错了?我明白为什么消息会进入错误队列 - 因为发行者没有订阅他们,但同时他是消费者,因此会发生 错误情况。当(重新)启动接收器时,是否可以从错误队列中恢复消息?

masstransit是2.10.0.0。

在此先感谢。

+0

我建议你将masstransit升级到<= 3.0.0版本,它有更好的API。这里是masstransit v3及更高版本的文档:http://masstransit-project.com/MassTransit/ –

+0

我无法使用更高版本。 – Sharov

回答

2

.ReceiveFrom()地址对于每个服务应该是唯一的,并且只有在服务具有相同的使用者且使用相同的消息类型时才共享。使用相同RabbitMQ服务器的服务之间唯一的共同点是主机(如果使用的话,也是虚拟主机)。否则,他们必须有所不同。

是的,他们会进入错误队列,因为发布者没有订阅它们。给你的发布者一个不同的队列名称,问题就解决了。

+0

谢谢你的回复。仍然我无法得到它 - 为什么我应该指定ReceiveFrom()如果我只想发送消息?为什么uri在ConfigureHost方法是不够的?另外,当我指定不同的uri字符串(一个用于ConfigureHost,一个用于ReceiveFrom)时,则会将消息发送到由ReceiveFrom方法指定的队列。很奇怪... – Sharov

+0

它是v2 API的时代和演变的人造物。 V3 api更有意义,但是你说你不能升级,所以你一直坚持下去。 –

+0

如果v3可以帮助避免这种情况,我会尝试迁移。我认为它是特定于RMQ的。 – Sharov