首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用azure服务总线的Masstransit :为什么消息要发送到queue_skipped?

使用azure服务总线的Masstransit :为什么消息要发送到queue_skipped?
EN

Stack Overflow用户
提问于 2021-06-13 10:37:41
回答 1查看 49关注 0票数 0

我正在使用带有Azure服务.net5的Masstransit。

我有两个应用程序:

Web Api。启动:

代码语言:javascript
复制
services.AddMassTransit(x =>
{
   x.UsingAzureServiceBus((context,cfg) =>
   {
      cfg.Host("Endpoint");

      cfg.ReceiveEndpoint("mytopic", e =>
         {
             e.PrefetchCount = 100;
             e.MaxConcurrentCalls = 100;
         });
      cfg.ConfigureEndpoints(context);
    });
});
services.AddMassTransitHostedService();

Web Api。事件发布控制器:

代码语言:javascript
复制
[HttpGet]
public async Task<bool> Get()
{
    await _bus.Publish(new Message()
    {
        Name = "Test Name",
        Description = "Test Description",
        Order = 1
    });

    return true;
}

Worker服务。程序:

代码语言:javascript
复制
services.AddMassTransit(x =>
{
    x.AddConsumer<MessageConsumer>();
    x.UsingAzureServiceBus((context,cfg) =>
    {
        cfg.Host("Endpoint");
        cfg.UseServiceBusMessageScheduler();

        cfg.ReceiveEndpoint("mytopic", e =>
        {
            e.PrefetchCount = 100;
            e.MaxConcurrentCalls = 100;
            e.ConfigureConsumer<MessageConsumer>(context);
        });
        cfg.ConfigureEndpoints(context);
    });
});
services.AddMassTransitHostedService(true);

Worker服务。消费者:

代码语言:javascript
复制
public class MessageConsumer : IConsumer<Message>
    {
        readonly ILogger<MessageConsumer> _logger;

        public MessageConsumer(ILogger<MessageConsumer> logger)
        {
            _logger = logger;
        }

        public async Task Consume(ConsumeContext<Message> context)
        {
            _logger.LogInformation("Received Text: {Text}", context.Message.Name);
        }
    }

两个应用程序都有事件类(代码中的消息类),它们位于相同的名称空间中。

代码语言:javascript
复制
namespace EventBusMessages
{
    public class Message
    {
        public string Name { get; set; }
        
        public string Description { get; set; }
        
        public int Order { get; set; }
    }
}

成功发送和处理一条消息后,下一条消息被放入队列***_skipped。则再次成功处理下一条消息,但随后再次执行***_skipped。

发布控制台示例:

代码语言:javascript
复制
[05:26:19 DBG] SEND sb://test.servicebus.windows.net/EventBusMessages/Message c7710000-e64a-00ff-df61-08d92e12a05d EventBusMessages.
Message
[05:26:20 DBG] SEND sb://test.servicebus.windows.net/EventBusMessages/Message c7710000-e64a-00ff-216c-08d92e12a182 EventBusMessages.
Message
[05:26:20 DBG] SKIP sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-216c-08d92e12a182
[05:26:21 INF] MOVE sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-216c-08d92e12a182 mytopic_skipped dead-letter
[05:26:22 DBG] SEND sb://test.servicebus.windows.net/EventBusMessages/Message c7710000-e64a-00ff-fc4d-08d92e12a27a EventBusMessages.
Message
[05:26:23 DBG] SEND sb://test.servicebus.windows.net/EventBusMessages/Message c7710000-e64a-00ff-d1a8-08d92e12a30b EventBusMessages.
Message
[05:26:23 DBG] SKIP sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-d1a8-08d92e12a30b
[05:26:23 INF] MOVE sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-d1a8-08d92e12a30b mytopic_skipped dead-letter

05:26:19和05:26:22已被消费者成功处理,但05:26:20和05:26:23已被跳过并移至***_skipped队列

消费者控制台示例:

代码语言:javascript
复制
[05:26:19 DBG] RECEIVE sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-df61-08d92e12a05d EventBusMessages.Message EventB
usSubscriber.MessageConsumer(00:00:00.0126036)
[05:26:22 INF] Received Text: Test Name
[05:26:22 DBG] RECEIVE sb://test.servicebus.windows.net/mytopic c7710000-e64a-00ff-fc4d-08d92e12a27a EventBusMessages.Message EventB
usSubscriber.MessageConsumer(00:00:00.0042202)

再一次,我每次都发送相同的消息

非常感谢你的回复

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-13 10:41:10

Web API项目不应具有接收终结点- it未配置使用者。因此接收端点将跳过每条消息。只有在拥有使用者时,才能配置接收终结点。

而且您只需要在添加了消费者之后调用ConfigureEndpoints

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67954374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档