Подключение к одному приложению EasyNetQ (AMQP) в ASP.NET?

Сообщество:

Я изо всех сил пытаюсь понять, как создать одно соединение AMQP, которое живет с моим жизненным циклом приложения ASP.NET в ASP.NET с использованием .NET Core 2.1. После исследования я нашел много ссылок на использование одного соединения AMQP для всего приложения, поскольку они дороги и медленны в создании, и я направился по пути создания соединения с использованием DI, но, похоже, мой подход ошибочен, я не могу определить, какой интерфейс мне нужно добавить как синглтон...

public void ConfigureServices(IServiceCollection services)
        {
            var sqlConnectionStringBuilder = new SqlConnectionStringBuilder(Configuration.GetConnectionString("DefaultConnection"));
            var envSQL = Environment.GetEnvironmentVariable("ASPNETCORE_SQL_SERVER");
            if (envSQL != null)
                sqlConnectionStringBuilder.DataSource = envSQL;

            services.AddSingleton<IMessageBusService, MessageBusService>();
            services.AddSingleton<EasyNetQ.IAdvancedBus, RabbitAdvancedBus>();
            services.AddSingleton<EasyNetQ.IConnectionFactory, ConnectionFactoryWrapper>();

            services.AddMvc();

        }

Добавление вышеуказанных интерфейсов работает, но я получаю сообщение об ошибке о том, что служба ConnectionConfiguration не может быть обнаружена. Это правильное направление или есть более правильный способ создать одно приложение после подключения EasyNetQ в ядре ASP.NET?


person jayc    schedule 29.10.2018    source источник


Ответы (1)


Вы можете использовать AutoSubscriber в .net core и использовать пример кода здесь.

добавить подключение к appsettings.json

"MessageBroker": {
"ConnectionString": "host=localhost"
}

затем добавьте IBus в ConfigureServices

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IBus>(RabbitHutch.CreateBus(Configuration["MessageBroker:ConnectionString"]));
        services.AddSingleton(RabbitHutch.CreateBus(Configuration["MessageBroker:ConnectionString"]));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

добавьте класс AppBuilderExtension и используйте метод расширения для автоматического подписчика

public static class AppBuilderExtension
{
    public static IApplicationBuilder UseSubscribe(this IApplicationBuilder appBuilder, string subscriptionIdPrefix, Assembly assembly)
    {
        var services = appBuilder.ApplicationServices.CreateScope().ServiceProvider;

        var lifeTime = services.GetService<IApplicationLifetime>();
        var Bus = services.GetService<IBus>();
        lifeTime.ApplicationStarted.Register(() =>
        {
            var subscriber = new AutoSubscriber(Bus, subscriptionIdPrefix);
            subscriber.Subscribe(assembly);
            subscriber.SubscribeAsync(assembly);
        });

        lifeTime.ApplicationStopped.Register(() => Bus.Dispose());

        return appBuilder;
    }
}

добавить UseSubscribe в Configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
        app.UseSubscribe("ClientMessageService", Assembly.GetExecutingAssembly());

        app.UseHttpsRedirection();
        app.UseMvc();
    }

затем создайте контроллер производителей

[Route("api/[controller]")]
[ApiController]
public class ProducersController : ControllerBase
{
    private readonly IBus _bus;

    public ProducersController(IBus bus)
    {
        _bus = bus;
    }
    [HttpGet]
    [Route("Send")]
    public JsonResult Send()
    {

        _bus.Publish(new TextMessage { Text = "Send Message from the Producer" });

        return new JsonResult("");
    }


}

затем создайте контроллер потребителей

[Route("api/[controller]")]
[ApiController]
public class ConsumersController : ControllerBase, IConsume<TextMessage>
{
    [HttpGet]
    [Route("Receive")]
    public JsonResult Receive()
    {
        using (var bus = RabbitHutch.CreateBus("host=localhost"))
        {
            bus.Subscribe<TextMessage>("test", HandleTextMessage);
        }
        return new JsonResult("");
    }


    private static void HandleTextMessage(TextMessage textMessage)
    {
        var item = textMessage.Text;
    }

    public void Consume(TextMessage message)
    {
        // code receive message
    }
}
person Reza Jenabi    schedule 04.09.2019