Asp.net core MassTransit消费者从未收到信息
我正在按照在ASP.NET核心应用程序中使用MassTransit与RabbitMQ和Autofac的文档构建一个演示应用程序: 我的程序代码:Asp.net core MassTransit消费者从未收到信息,asp.net-core,rabbitmq,masstransit,consumer,Asp.net Core,Rabbitmq,Masstransit,Consumer,我正在按照在ASP.NET核心应用程序中使用MassTransit与RabbitMQ和Autofac的文档构建一个演示应用程序: 我的程序代码: namespace MessageDemo { public class Program { public static void Main(string[] args) { var host = Host.CreateDefaultBuilder(args)
namespace MessageDemo
{
public class Program
{
public static void Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webHostBuilder =>
{
webHostBuilder
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>();
})
.Build();
host.Run();
}
}
}
namespace-MessageDemo
{
公共课程
{
公共静态void Main(字符串[]args)
{
var host=host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(新的AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webHostBuilder=>
{
网络主机生成器
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.UseStartup();
})
.Build();
host.Run();
}
}
}
我的创业:
public class Startup
{
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
public ILifetimeScope AutofacContainer { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
// ConfigureContainer is where you can register things directly
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<DemoContent>().As<IDemoContent>();
builder.RegisterType<WeatherForecast>().As<IWeatherForecast>();
builder.AddMassTransit(x =>
{
x.AddConsumer<DemoConsumer>();
x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host("rabbitmq://my_container_ip/", host =>
{
host.Username("devuser");
host.Password("devuser");
});
cfg.ReceiveEndpoint("submit-data", ec =>
{
// Configure a single consumer
ec.ConfigureConsumer<DemoConsumer>(context);
});
}));
});
}
}
公共类启动
{
公共启动(IWebHostEnvironment env)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
this.Configuration=builder.Build();
}
公共IConfiguration配置{get;}
公共ILifetimeScope自动传真容器{get;set;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddOptions();
services.AddControllers();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
this.AutofacContainer=app.ApplicationServices.GetAutofacRoot();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
//ConfigureContainer是您可以直接注册内容的地方
公共void配置容器(ContainerBuilder生成器)
{
builder.RegisterType().As();
builder.RegisterType().As();
builder.AddMassTransit(x=>
{
x、 AddConsumer();
x、 AddBus(context=>Bus.Factory.CreateUsingRabbitMq(cfg=>
{
主机(“rabbitmq://my_container_ip/,主机=>
{
host.Username(“devuser”);
主机密码(“devuser”);
});
接收端点(“提交数据”,ec=>
{
//配置单个使用者
ec.配置消费者(上下文);
});
}));
});
}
}
我的消费者:
public class DemoConsumer : IConsumer<IDemoContent>
{
public async Task Consume(ConsumeContext<IDemoContent> context)
{
Debug.WriteLine($"Write content: {context.Message.Data}");
await Console.Out.WriteLineAsync($"Write content: {context.Message.Data}");
}
}
公共类DemoConsumer:IConsumer
{
公共异步任务使用(使用上下文)
{
WriteLine($“写入内容:{context.Message.Data}”);
wait Console.Out.WriteLineAsync($“写入内容:{context.Message.Data}”);
}
}
为了进行测试,我通过点击一个控制器端点触发publish,PublishindPoint由容器注入:
// GET: api/Demo
[HttpGet]
public async void Get()
{
await _endpoint.Publish<IDemoContent>(new
{
Data = "Some random content"
}, new CancellationToken());
}
//GET:api/Demo
[HttpGet]
公共异步void Get()
{
等待_endpoint.Publish(新建)
{
Data=“一些随机内容”
},新的CancellationToken());
}
这一切似乎都在起作用
-没有错误消息
-添加了一个使用InMemoryTestHarness的演示单元测试,该测试正在运行
-我的RabbitMQ实例在Manager Overview中注册已发布的消息
我正在RabbitMQ管理UI中获得发布者确认,但消息显示为不可终止(drop)。由于您尚未添加托管服务,总线无法启动
services.AddMassTransitHostedService();
它就在代码片段中。由于您尚未添加托管服务,因此总线无法启动
services.AddMassTransitHostedService();
它就在代码片段中。谢谢,我不知道我怎么把那个调用放错地方了。还需要将BusRegistry builder.RegisterType()注册为().SingleInstance();谢谢,我不知道我怎么把电话放错地方了。还需要将BusRegistry builder.RegisterType()注册为().SingleInstance();注意:我通过添加服务完成了下面建议的修复。AddMassTransitHostedService();到我的ConfigureServices方法,但还需要注册它的依赖项生成器。RegisterType().As().SingleInstance();注意:我通过添加服务完成了下面建议的修复。AddMassTransitHostedService();到我的ConfigureServices方法,但还需要注册它的依赖项生成器。RegisterType().As().SingleInstance();