最近開始在項目中使用easynetq,大概瞭解了下api,在網上看了下示例,結果沒有一個運行成功的,一個最簡單的發佈訂閱都沒有成功。我是直接運行起來別人的示例,不應該啊,後來一直分析一直分析,最後發現:消息沒有序列化!這還是其一,第二點,應該要先起來消息接收端,再起來消息發佈端。一開始就是簡單的: ...
最近開始在項目中使用easynetq,大概瞭解了下api,在網上看了下示例,結果沒有一個運行成功的,一個最簡單的發佈訂閱都沒有成功。我是直接運行起來別人的示例,不應該啊,後來一直分析一直分析,最後發現:消息沒有序列化!這還是其一,第二點,應該要先起來消息接收端,再起來消息發佈端。一開始就是簡單的:
static void Main() { using( var bus = RabbitHutch.CreateBus( "host=localhost" ) ) { bus.Subscribe<TextMessage>( "test", HandleTextMessage ); Console.WriteLine( "Listening for messages. Hit <return> to quit." ); Console.ReadLine(); } } static void HandleTextMessage( TextMessage textMessage ) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine( $"Got message {textMessage.Text}" ); }
private static void Main() { using (var bus = RabbitHutch.CreateBus("host=localhost")) { var input = ""; Console.WriteLine("Enter a message. 'Quit' to quit."); while ((input = Console.ReadLine())?.ToUpper() != "QUIT") { bus.Publish(new TextMessage { Text = input }); } } }
public class TextMessage { public string Text { get; set; } }
結果,黑視窗還是黑視窗,為什麼沒有消息訂閱的輸出?其實就是因為我們的消息沒有序列化。在發佈端增加:
bus.Publish<string>(JsonConvert.SerializeObject(new TextMessage{ Text = "Hello World" }));
在介面端增加:
var myMessage = (TextMessage)JsonConvert.DeserializeObject<TextMessage>(obj);
這樣就可以了。
其實我們可以使用高級API中的message類來包裝我們的消息,這樣的話,可以不用在發佈端序列化消息,但是依舊需要在接收端反序列化消息。具體請參考:
EasyNetQ-高級API