2017-09-04 103 views
0

我有一個消息泵看起來像這樣:Azure的服務總線撮合消息泵,等待着多種消息類型

public class MessagePump<T> where T : class 
    { 
     public async Task Run(string inQueue, IMessageProcessor<T> processor, CancellationToken cancellationToken) 
     { 
      var connectionString = Settings.ServiceBusConnectionString; 
      var factory = MessagingFactory.CreateFromConnectionString(connectionString); 
      var client = factory.CreateQueueClient(inQueue); 
      var msgOptions = new OnMessageOptions 
      { 
       AutoComplete = false, 
       MaxConcurrentCalls = 5, 
       AutoRenewTimeout = TimeSpan.FromMinutes(10) 
      }; 
      await Task.Run(() => 
      client.OnMessageAsync(
       async message => 
       { 
        await OnReceived(message, processor); 
        await message.CompleteAsync(); 
       }, msgOptions), 
       cancellationToken); 
     } 
     static async Task OnReceived(BrokeredMessage brokeredMessage, IMessageProcessor<T> processor) 
     { 
      var message = brokeredMessage.GetBody<T>(); 
      try 
      { 
       await processor.Process(message); 
      } 
      catch (Exception e) 
      { 
       var er = new ErrorLog(); 
       await er.Create(new {error = e.Message}); 
      } 

     } 
    } 

它是從我在Azure的服務織物

internal sealed class Core : StatelessService 
    { 
     public Core(StatelessServiceContext context) 
      : base(context) 
     { } 


     protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
     { 
      return new ServiceInstanceListener[0]; 
     } 

     protected override async Task RunAsync(CancellationToken cancellationToken) 
     { 
      var inQueue = Settings.CoreQueue; 
      await new MessagePump<Message>().Run(inQueue, new Processor(), cancellationToken); 

     } 
    } 

如何無國籍的服務,稱爲我是否創建了一個消息泵來處理多種類型的消息?

回答

2

幾個選項:

  1. 編碼所有類型的作爲一個容器類型的一部分(例如,導出它們都來自同一個基類,或把它們都進入容器類型的屬性)。始終反序列化此容器,然後根據其內容處理它。

  2. 把消息的類型爲元數據(例如BrokeredMessageContentType財產。反序列化到特定類型的閱讀這些元數據之後。

  3. 呼叫GetBody剛剛返回一個字節數組,並處理反序列化自己。強權是唯一的選擇,如果你不控制發送方

+0

我覺得#2是最好的解決方案!!(鑑於有能力設計發件人)#1創造了一個大混亂 – LastTribunal