【问题标题】:RabbitMQ .Net coreRabbitMQ .Net 核心
【发布时间】:2019-03-29 04:46:20
【问题描述】:

要在 .net 核心中配置 rabbitmq 消费者,我看到了控制台应用程序的示例。对于生产就绪的应用程序,我不确定控制台应用程序是否适合作为独立的 Rabbitmq 消费者。请分享您的想法构建消费者和部署到生产的推荐方式是什么。还请阅读不要在 ASP.net 核心应用程序中配置 Consumer,因为 IIS 可以回收,这不是一个好的选择

【问题讨论】:

  • 1) 有很多事情实际上与您所说的不符。 2)我不确定你问的是什么 - 如果有的话 - 具体问题。 3) 如果你真的有问题,我不确定 SO 是不是最好的论坛。
  • 我们不分享关于 SO 的想法,我们分享事实。提出问题,得到答案:-)

标签: .net rabbitmq masstransit easynetq


【解决方案1】:

如果你想在 .net core 中发布/订阅

首先你需要安装 lib RabbitMQ.Client

安装 NuGet 包 RabbitMQ.Client

那么你可以在 .net core 相同的控制台应用程序中使用 RabbitMQ。

您可以查看 .net core 2.2 here 的示例。

发布

public bool Publish()
{
    var RoutingKey = "QueueName";
    var Body = "Message";
    var Factory = new ConnectionFactory
        {
            UserName = "guest",
            Password = "guest",
            Port = 5672,
            HostName = "localhost",
            VirtualHost = "/"
        };

        using (var connection = Factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.ExchangeDeclare("messageexchange", ExchangeType.Direct);
            channel.QueueDeclare(RoutingKey, true, false, false, null);
            channel.QueueBind(RoutingKey, "messageexchange", RoutingKey, null);
            channel.BasicPublish("messageexchange", RoutingKey, null, Encoding.UTF8.GetBytes(Body));
        }

        return true;
        }

订阅

 public SubscribeResult Subscribe()
    {
        var Queue = "QueueName";
        var Factory = new ConnectionFactory
        {
            UserName = "guest",
            Password = "guest",
            Port = 5672,
            HostName = "localhost",
            VirtualHost = "/"
        };
        var subscribeResult = new SubscribeResult(); ;
        using (var connection = Factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {

            channel.QueueDeclare(queue: Queue, durable: true, exclusive: false, autoDelete: false, arguments: null);
            var result = channel.BasicGet(queue: Queue, autoAck: true);
            if (result != null)
            {
                subscribeResult.Body = Encoding.UTF8.GetString(result.Body);
            }
        }
        return subscribeResult;
    }

【讨论】:

    【解决方案2】:

    您可以在 Windows 服务或控制台应用程序中托管消费者(基本上就是服务,但具有一些启动/停止行为以与 Windows 服务控制管理器进行交互)。

    对于 Windows,您可以使用 Topshelf。对于 Linux 或 Mac,您只需使用控制台应用程序。当您可以将任何控制台应用程序用作服务时,.NET core 的未来版本可能会集成服务控件,并且配置中只有一条语句。

    您可以查看控制台服务here 的示例,还有很多使用 Windows 版 Topshelf 的示例。

    【讨论】:

      【解决方案3】:

      我们在拆分为微服务的大型 .NET Core 解决方案中使用 RabbitMQ。每个微服务只是一个普通的控制台应用程序或 ASP.NET Core,然后可以作为服务在 Windows 上运行,也可以作为 Linux 上的守护程序运行。

      从 .NET Core 2.1 开始,微软引入了 Microsoft.AspNetCore.Hosting.WindowsServices 命名空间,允许将 ASP.NET Core 作为 Windows 服务运行: https://docs.microsoft.com/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.2&tabs=visual-studio

      或者您可以将 Microsoft.Windows.Compatibility 的 ServiceBase 用于控制台应用程序: https://www.pmichaels.net/2019/01/08/creating-a-windows-service-using-net-core-2-2/

      我们主要部署到 Linux 系统,所以我们使用 HostedServices 的方法:

      static async Task Main(string[] args)
              {
                  await new HostBuilder()
                      .ConfigureServices((hostContext, services) =>
                      {
                          services.AddHostedService<MyService>();
                      })
                      .RunConsoleAsync();
              }
      
      public sealed class MyService : IHostedService, IDisposable
      {
        public Task StartAsync(CancellationToken cancellationToken) {}
        public Task StopAsync(CancellationToken cancellationToken)
      }
      

      【讨论】:

        【解决方案4】:

        **

        class Program
        {
            static void Main(string[] args)
            {
                var connectionFactory = new ConnectionFactory()
                {
                    UserName = "guest",
                    Password = "guest",
                    AutomaticRecoveryEnabled = true,
                    HostName = "localhost",
                    Port = 5672,
                    DispatchConsumersAsync = true
                };
        
                var connection = connectionFactory.CreateConnection();
                //services.AddSingleton(connection);
        
                //services.AddScoped(serviceProvider =>
                //{
                //    var conn = serviceProvider.GetService<IConnection>();
                //    return conn.CreateModel();
                //});
        
                var channel = connection.CreateModel();
        
                var basicConsumer = new AsyncEventingBasicConsumer(channel);
                basicConsumer.Received += BasicConsumerOnReceived;
                channel.QueueDeclare("queename", true, false, false, null);
                //publish test message
                //channel.BasicPublish("", "queename", false, null, Encoding.UTF8.GetBytes(" test message"));
                channel.BasicConsume("queename", true, basicConsumer);
                System.Console.ReadLine();
            }
        
        
            private static Task BasicConsumerOnReceived(object sender, BasicDeliverEventArgs args)
            {
                var body = args.Body;
                var str = Encoding.UTF8.GetString(body.ToArray());
                System.Console.WriteLine(str);      
                return Task.CompletedTask;
            }
        }
        

        **

        【讨论】:

        • 通过我在.Net Core中分享的代码,你可以在不应用控制台的情况下监听兔子队列。评论部分可以添加到服务中。
        猜你喜欢
        • 1970-01-01
        • 2017-10-23
        • 2018-06-30
        • 2019-10-20
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 2019-06-09
        相关资源
        最近更新 更多