2017-08-08 53 views
0

我正在努力與MassTransit,這是另一個棘手的問題,我還沒有解決。 當我直接調用發佈方法時,一切正常,郵件發送到RMQ。但是當我用自己的方法封裝這個方法並且在包裝類的構造函數中注入總線時,它不起作用。消息根本就沒有到達公共汽車。IBusControl發佈什麼都不做,同時包裝到另一個類

using (var uow = new Wrapper(ctx, bus)) 
{ 
    var itemMsg = new ItemChangedMessage() { Value = item.Value }; 

    uow.Publish(itemMsg); //Does not work 

    bus.Publish(itemMsg); //Works fine 
} 

這裏是一個包裝類的方法。沒什麼特別的。

public void Publish(IMessage message) 
{ 
    bus.Publish(message); 
    ... 
} 

我完全不知道這裏可能會出現什麼樣的問題。嘗試了異步\ await不同的組合,但沒有任何幫助。

回答

2

我認爲您的包裝在調用完成之前已處理完畢,因爲您並未等待發布。你必須async/await或者你可以在包裝內使用TaskUtil.Await(() => bus.Publish(message));

這應該工作:

using (var uow = new Wrapper(ctx, bus)) 
{ 
    var itemMsg = new ItemChangedMessage() { Value = item.Value }; 

    await uow.Publish(itemMsg); 
} 

...

public async Task Publish(object message) 
{ 
    await bus.Publish(message); 
    ... 
} 

但主要的問題確實是別的東西。正如在另一個答案正確指出,您正在使用類型的超載Publish<T>(T message),但您的TIMessage,所以MassTransit將發佈到IMessage交易所,因爲您最有可能訂閱ItemChangedMessage,您的消費者永遠不會得到它。

您可以很容易地看到這個看着調試日誌時:

[15時51分06秒DBG]外匯:BusWrapper:即時聊天(耐久)

[15時51分06秒DBG] SEND RabbitMQ的://本地主機/ BusWrapper:即時聊天1b340000-da2d-1866-1043-08d4de648414 BusWrapper.IMessage

您不必與任何接口您的郵件標記,它只能造成不必要的交流和依賴性,你會想將你的消息接口作爲一個lib來共享郭寶宏。根據此答案中的更新代碼,您可以很好地使用public async Task Publish(object message)

或者,您可以使用Publish(object message)重載,它會爲您找到適合的類型並正確發佈。在這種情況下,你需要有這個在您的包裝:

public async Task Publish(IMessage message) 
{ 
    await bus.Publish((object) message); 
    ... 
} 
+0

已經嘗試了TaskUtil.Await(()=> _bus.Publish(message));同樣,但它沒有幫助。 –

+0

好的,我知道它是什麼 –

+0

@AlexeyKoptyaev更新了我的答案。我被這幾次燒傷了。 –

1

我認爲Publish是通用的,並且在您的方法中使用了不同的重載。將您的方法簽名更改爲:

public void Publish<T>(T message) where T : IMessage 
+0

有沒有需要有一個接口 –

+0

@AlexeyZimarev可能,我不知道是什麼發佈預計,但我離開那裏,以保持一致與OP代碼 – MistyK

+0

@MistyK Nope,它是相同的重載,因爲ItemChangedMessage實現IMessage –