Below is my Program.cs setup :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddDbContext<AuctionDbContext>(opt =>
{
opt.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"));
});
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddMassTransit(x =>
{
x.AddEntityFrameworkOutbox<AuctionDbContext>(o =>
{
o.QueryDelay = TimeSpan.FromSeconds(10);
o.UsePostgres();
o.UseBusOutbox();
});
x.AddConsumersFromNamespaceContaining<AuctionCreatedFaultConsumer>();
x.SetEndpointNameFormatter(new KebabCaseEndpointNameFormatter("auction", false));
x.UsingRabbitMq((context, cfg) =>
{
cfg.UseRetry(r =>
{
r.Handle<RabbitMqConnectionException>();
r.Interval(5, TimeSpan.FromSeconds(10));
});
cfg.Host(builder.Configuration["RabbitMq:Host"], "/", host =>
{
host.Username(builder.Configuration.GetValue("RabbitMq:Username", "guest"));
host.Password(builder.Configuration.GetValue("RabbitMq:Password", "guest"));
});
cfg.ConfigureEndpoints(context);
});
});
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = builder.Configuration["IdentityServiceUrl"];
options.RequireHttpsMetadata = false;
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.NameClaimType = "username";
});
builder.Services.AddScoped<IAuctionRepository, AuctionRepository>();
builder.Services.AddGrpc();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.MapGrpcService<GrpcAuctionService>();
var retryPolicy = Policy
.Handle<NpgsqlException>()
.WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(10));
retryPolicy.ExecuteAndCapture(() => DbInitializer.InitDb(app));
app.Run();
On starting the application, I am getting the below error.
fail: MassTransit.EntityFrameworkCoreIntegration.BusOutboxDeliveryService[0]
ProcessMessageBatch faulted
Npgsql.PostgresException (0x80004005): 42P01: relation "OutboxState" does not exist
Exception data:
Severity: ERROR
SqlState: 42P01
MessageText: relation "OutboxState" does not exist
Position: 128
File: parse_relation.c
Line: 1392
Routine: parserOpenTable
I am using RabbitMQ with MassTransit and PostGres database.
Finally solved it, The problem was in the EntityFramework Migration. I did not add migration for the below MassTransit Tables.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.AddInboxStateEntity();
modelBuilder.AddOutboxMessageEntity();
modelBuilder.AddOutboxStateEntity();
}