我正在使用Masstransit和RabbitMQ發佈事件(沒有消費者,只使用發佈者),而此刻我正在嘗試創建集成測試以驗證消息已發佈,如果是這樣,我想檢查它是否是正確的消息。要做到這一點,我創建一個消費者消費隊列中的消息,並將其與我的預期進行比較。這裏的問題是,我不能消費這個消息。該活動已成功發佈,但無法獲取消息。試圖從MassTransit消費者獲取消息
這是負責連接消費者
public class ServiceBusHelper
{
private IBusControl bus;
private readonly string serviceBusQueueName = ConfigurationManager.AppSettings["ServiceBusQueuename"];
private readonly string serviceBusEndpoint = ConfigurationManager.AppSettings["ServiceBusEndPoint"];
private readonly string serviceBusUsername = ConfigurationManager.AppSettings["ServiceBusUsername"];
private readonly string serviceBusPassword = ConfigurationManager.AppSettings["ServiceBusPassword"];
public ConnectHandle HandleObserver { get; set; }
public void ConnectRabbitMQ()
{
bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(
new Uri(serviceBusEndpoint),
h =>
{
h.Username(serviceBusUsername);
h.Password(serviceBusPassword);
});
cfg.ReceiveEndpoint(
serviceBusQueueName,
e =>
{
e.Consumer<ServiceBusEventsHelper>();
});
});
//Observer
var observer = new PublishedObserverHelper();
HandleObserver = bus.ConnectPublishObserver(observer);
}
}
類,這是會消耗消息
public class ServiceBusEventsHelper : IConsumer<ITransportCreatedEvent>
{
public ITransportCreatedEvent Result { get; set; }
public async Task Consume(ConsumeContext<ITransportCreatedEvent> context)
{
Result = await Task.FromResult(context.Message);
}
}
和在測試方法的類我有此
ServiceBusEventsHelper eventHelper = new ServiceBusEventsHelper();
ServiceBusHelper busHelper = new ServiceBusHelper();
try
{
busHelper.ConnectRabbitMQ();
transportResponseDto = await this.transportClient.CreateTransportAsync(transportRequest);
handle = busHelper.HandleObserver;
var eventResponse = eventHelper.Result;// Allways NULL
}
catch (Exception ex)
{
Assert.Fail(ex.GetDetailMessage());
}
我試圖得到這樣的消息結果
var eventResponse = eventHelper.Result;// Allways NULL
但是全部爲空。
有人可以幫我嗎?
我有一個服務,方法之一是CreateTransportAsync(),以及我稱之爲內發佈
public async Task<TransportResponseDto> CreateTransportAsync(TransportDto request){
.
.
.
await this.RaiseTransportCreatedEvent(transportResponseDto);
}
private async Task RaiseTransportCreatedEvent(TransportResponseDto transportResponseDto)
{
var evt = CreateTransportEvent(transportResponseDto);
await this.serviceBus.Publish(evt).ConfigureAwait(false);
}
public class ServiceBus<T> : IServiceBus<T> where T : class
{
private readonly IBus bus;
public ServiceBus(IBus bus)
{
this.bus = bus;
}
public Task Publish(T evt)
{
return bus.Publish(evt, evt.GetType());
}
}
這是我的發佈事件,和它的作品。現在我試圖測試是否所有這些都與另一個解決方案中的集成測試一起工作,其中我試圖創建一個使用者從隊列中消費消息。然後,我想驗證該消息(將其與json文件中的假消息進行比較)以查看是否一切正常。問題是我無法得到這個消息,我不知道發生了什麼。 P.S:我真的不明白你試圖在一點要說3. 感謝
感謝您的回覆!我不知道爲什麼bus.StartAsync()消失,但它在那裏,問題不是這樣。我想,就像你說的那樣,問題是我試圖快速訪問響應,而我不知道如何等待它。我走了告訴你更多的代碼,看看你是否可以幫助我 – EGM
@EGM如果你想更新你的問題 - 做到這一點,不要爲此創建一個「答案」。本質上,你正在檢查一個永遠不會更新的對象的屬性 - 見第3點。我試圖更詳細地解釋它。 –