2017-09-04 96 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