【问题标题】:Multiple vhost connection inside same project (Subscribe / Publish)同一项目内的多个虚拟主机连接(订阅/发布)
【发布时间】:2021-01-19 02:37:07
【问题描述】:

我们的要求如下:-

  1. Exchange 1 是一个主题交换器,队列 1 绑定到它。它在 VHOST 1 上。
  2. 应用程序订阅了队列 1。它处理队列 1 的消息。处理队列 1 消息后,我们希望将下一条消息发布到 VHOST 2 上的不同交换器(不同的兔子连接)

我有以下问题:-
a) 是否可以在没有联合的情况下实现这一点?
a b) 在同一个应用程序中,我可以维护 2 个不同的兔子连接吗?

我们使用 EasynetQ 作为客户端连接 rabbitmq。

您能否分享一些关于此的示例。

提前致谢。

【问题讨论】:

    标签: c# rabbitmq easynetq


    【解决方案1】:

    a) 是的,您还可以在 vhost 之间创建铲子,这比联邦更简单

    b) 是的,我认为创建多个 IBus 实例没有问题,只要您为每个总线实例使用不同的 DI(子)容器,因此会增加复杂性。

    【讨论】:

      【解决方案2】:

      这是我处理多个连接的方式。我无法直接从 EasyNetQ 找到解决方案。我不使用 MS DI 的默认 DI 适配器。而且我只使用advanced api并手动注入我需要的服务。到目前为止,它似乎有效,但肯定需要更多测试。

      在 startup.cs/ConfigureServices 中

                  services.AddBusStation(busStationBuilder =>
                  {
                      // inject IBusStation and get the bus thru name
                      appSettings.RabbitMQSettings.Connections.ForEach(c =>
                      {
                          var taskQueueBus = RabbitHutch.CreateBus(c.ConnectionString, CustomServiceRegister.ServiceRegisterAction());
                          c.Exchanges.ForEach(async e =>
                          {
                              await taskQueueBus.Advanced.ExchangeDeclareAsync(e.Name, e.Type, e.Durable, e.AutoDelete);
                          });
                          busStationBuilder.Add(c.Name, taskQueueBus.Advanced);
                          busStationBuilder.AddDefaultBus(taskQueueBus);
                      });
                  });
      
          public interface IBusStation
          {
              IBus DefualtBus { get; }
              IAdvancedBus Get(string busName);
              void Add(string busName, IAdvancedBus advancedBus);
              void Add(IBus bus);
          }
      
          public class BusStation : IBusStation
          {
              private Dictionary<string, IAdvancedBus> BusList { get; set; } = new Dictionary<string, IAdvancedBus>();
              public IBus DefualtBus { get; private set; }
              public IAdvancedBus Get(string busName)
              {
                  if (BusList.TryGetValue(busName, out IAdvancedBus advancedBus))
                  {
                      return advancedBus;
                  }
                  return null;
              }
              public void Add(string busName, IAdvancedBus advancedBus)
              {
                  BusList.Add(busName, advancedBus);
              }
              public void Add(IBus bus)
              {
                  this.DefualtBus = bus;
              }
          }
      
          public class BusStationBuilder
          {
              private readonly IBusStation _BusStation;
      
              public BusStationBuilder(IServiceCollection services, IBusStation busStation)
              {
                  this._BusStation = busStation;
                  services.AddSingleton(busStation);
              }
              public BusStationBuilder Add(string busName, IAdvancedBus advancedBus)
              {
                  _BusStation.Add(busName, advancedBus);
                  return this;
              }
              public BusStationBuilder AddDefaultBus(IBus bus)
              {
                  _BusStation.Add(bus);
                  return this;
              }
          }
      
          public static class DependencyExtensions
          {
              public static IServiceCollection AddBusStation(this IServiceCollection services, Action<BusStationBuilder> builder)
              {
                  var busStationBuilder = new BusStationBuilder(services, new BusStation());
                  builder(busStationBuilder);
                  return services;
              }
          }
      

      appsettings.json

      
          "RabbitMQSettings": {
              "DefaultQueue": "task.main",
              "Connections": [
                  {
                      "Name": "Task_Queue",
                      "ConnectionString": "host=192.168.123.123;virtualHost=/;username=admin;password=password123;prefetchCount=1;persistentMessages=true;publisherConfirms=true",
                      "Exchanges": [
                          {
                              "Name": "Direct_Task_Queue",
                              "Type": "direct",
                              "Passive": false,
                              "Durable": true,
                              "AutoDelete": false,
                              "Internal": false,
                              "AlternateExchange": null,
                              "Delayed": false
                          }
                      ]
                  }
              ]
          },
      

      【讨论】:

        猜你喜欢
        • 2020-11-16
        • 1970-01-01
        • 2017-03-06
        • 2015-07-01
        • 2020-10-11
        • 2012-04-02
        • 1970-01-01
        • 2014-11-04
        • 2015-12-03
        相关资源
        最近更新 更多