2017-10-17 121 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