代码之家  ›  专栏  ›  技术社区  ›  LastTribunal

Azure服务总线代理消息泵,等待多种消息类型

  •  0
  • LastTribunal  · 技术社区  · 8 年前

    我有一个消息泵,看起来像这样:

    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});
                }
    
            }
        }
    

    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);
    
            }
        }
    

    如何创建处理多种类型消息的消息泵?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mikhail Shilkov    8 年前

    几个选项:

    1. 将所有类型编码为一个容器类型的一部分(例如,从一个基类派生它们,或将它们全部放入容器类型的属性中)。始终反序列化此容器,然后根据其内容进行处理。

    2. 将消息类型放入元数据(例如。 ContentType BrokeredMessage . 读取此元数据后反序列化为特定类型。

    3. GetBody