C# RabbitMQ基本连接方式和四种模式使用Dome

1.先部署好RabbitMQ

2.进入登录页面

3.创建虚拟机

4.添加新用户

5.新用户绑定虚拟机

6.代码创建与rabbitmq链接

需下载引用包

 

 public class RabbitMQHelper
    {
        /// <summary>
        /// 获取RabbitMQ连接对象方法(创建与RabbitMQ的连接)
        /// </summary>
        /// <returns></returns>
        public static IConnection GetConnection() {
            //创建连接工厂【设置相关属性】
            var connectionFactory = new ConnectionFactory()
            {
                //设置IP
                HostName = "127.0.0.1",//RabbitMQ地址
                Port = 5672,//端口
                VirtualHost = "/test",//RabbitMQ中要请求的VirtualHost名称
                UserName ="test",//RabbitMQ用户
                Password= "test"//RabbitMQ用户密码

            };
            //通过工厂创建连接对象
            return connectionFactory.CreateConnection();

        }
    }

 7.简单模式

生产者

/// <summary>
    /// 简单队列模式-生产者
    /// </summary>
    public class SampleProducer
    {
        /// <summary>
        /// 简单队列模式
        /// 生产者
        /// 通过管道向RabbitMQ发送消息
        /// </summary>
        public void SendMessage() {
            //获取连接对象
            using var connection=RabbitMQHelper.GetConnection();
            //创建管道
            using var channel= connection.CreateModel();
            //创建队列
            channel.QueueDeclare("sample_queue",false,false,false,null);

            for (int i = 0; i < 5; i++)
            {
                string msg = $"Hello Word Message{i + 1}";
                var body = Encoding.UTF8.GetBytes(msg);
                //向RabbitMQ发送消息
                //routingKey指定发往哪个队列(如routingkey和队列名相同则为默认队列)
                //exchange为空则默认链接的交换机, false,null, body为消息主体
                channel.BasicPublish("", "sample_queue", false, null, body);
                //输出发送的消息
                Console.WriteLine(msg);
            }
        }
    }

 消费者

 /// <summary>
    /// 简单队列模式-消费者
    /// </summary>
    public class SampleConsumer
    {
        /// <summary>
        /// 简单队列模式
        /// 消费者
        /// 通过管道向RabbitMQ获取消息且消费消息
        /// </summary>
        public static void ConsumerMessage() {
            //获取连接对象
            var connection=RabbitMQHelper.GetConnection();
            //创建管道
            var chennel=connection.CreateModel();
            //创建队列(如队列已存在的情况可不用再次创建/此创建为:确保先开启消费者,生产者未创建队列而引发报错)
            chennel.QueueDeclare("sample_queue", false, false, false, null);

            //事件对象
           var consumer= new EventingBasicConsumer(chennel);
            consumer.Received += (model, ea) => {
                //获取消息
                var body=ea.Body;//获取队列中消息主体
                var msg=Encoding.UTF8.GetString(body.ToArray());//转为string
                var routingkey=ea.RoutingKey;//队列名
                Console.WriteLine($"message is:{msg} ,routingkey => {routingkey}");
            };
            //消费消息
            chennel.BasicConsume("sample_queue", true, consumer);

        }
    }

8.发布订阅模式

生产者

 /// <summary>
    /// 发布订阅模式-生产者
    /// </summary>
    public class FanoutProducer
    {
        /// <summary>
        /// 发布订阅模式
        /// 生产者
        /// 设置交换机,创建多个队列,队列订阅交换机,生产者往交换机发送消息即可
        /// </summary>
        public void SendMessage() {
            //获取连接对象
            using var connection = RabbitMQHelper.GetConnection();
            //创建管道
            using var channel = connection.CreateModel();
            //创建交换机
            channel.ExchangeDeclare("fanout_Exchange","fanout",false,false,null);
            //创建队列
            channel.QueueDeclare("fanout_queue1",false,false,false,null);
            channel.QueueDeclare("fanout_queue2", false, false, false, null);
            channel.QueueDeclare("fanout_queue3", false, false, false, null);
            //把队列绑定到交换机(就是队列订阅交换机)
            channel.QueueBind("fanout_queue1", "fanout_Exchange", "",null);
            channel.QueueBind("fanout_queue2", "fanout_Exchange", "", null);
            channel.QueueBind("fanout_queue3", "fanout_Exchange", "", null);

            for (int i = 0; i < 10; i++)
            {
                string msg = $"RabbiteMQ fanout Message{i+1}";
                var body=Encoding.UTF8.GetBytes(msg);
                //发送消息
                //创建了交换机则不需要routingkey了,因为只需要队列订阅交换机即可
                //消息发送到交换机,创建了的队列订阅了交换机则会自动去交换机拿值
                channel.BasicPublish("fanout_Exchange","",false,null,body);
                Console.WriteLine(msg);
            }
        }
    }

消费者

/// <summary>
    /// 发布订阅模式-消费者
    /// </summary>
    public class FanoutConsumer
    {
        /// <summary>
        /// 发布订阅模式
        /// 消费者
        /// 通过管道向RabbitMQ获取消息且消费消息
        /// </summary>
        public static void ConsumerMessage()
        {
            //获取连接对象
            var connection = RabbitMQHelper.GetConnection();
            //创建管道
            var channel = connection.CreateModel();

            /*
             * 在消费者创建队列/交换机是以防范先启动消费者而引发报错
             * (如队列已存在的情况可不用再次创建/此创建为:确保先开启消费者,生产者未创建队列而引发报错)
            */

            //创建交换机
            channel.ExchangeDeclare("fanout_Exchange", "fanout", false, false, null);
            //创建队列
            channel.QueueDeclare("fanout_queue1", false, false, false, null);
            channel.QueueDeclare("fanout_queue2", false, false, false, null);
            channel.QueueDeclare("fanout_queue3", false, false, false, null);
            //把队列绑定到交换机(就是队列订阅交换机)
            channel.QueueBind("fanout_queue1", "fanout_Exchange", "", null);
            channel.QueueBind("fanout_queue2", "fanout_Exchange", "", null);
            channel.QueueBind("fanout_queue3", "fanout_Exchange", "", null);

            //事件对象
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) => {
                //获取消息
                var body = ea.Body;//获取队列中消息主体
                var msg = Encoding.UTF8.GetString(body.ToArray());//转为string
                var routingkey = ea.RoutingKey;//队列名
                Console.WriteLine($"message is:{msg} ,routingkey => {routingkey}");
            };
            //消费消息
            //可一次消费多个队列消息(也可消费单个队列)
            channel.BasicConsume("fanout_queue1", true, consumer);
            channel.BasicConsume("fanout_queue2", true, consumer);
            channel.BasicConsume("fanout_queue3", true, consumer);
        }
    }

9.路由模式

生产者

 /// <summary>
    /// 路由模式-生产者
    /// </summary>
   public class DirectProducer
    {
        /// <summary>
        /// 路由模式
        /// 生产者
        /// 设置交换机,创建多个队列,队列订阅交换机,生产者往交换机发送消息即可
        /// 给队列设置指定routingkey,发送消息时可通过订阅了交换机队列的routingkry指定发送给某个队列
        /// </summary>
        public void SendMessage()
        {
            //获取连接对象
            using var connection = RabbitMQHelper.GetConnection();
            //创建管道
            using var channel = connection.CreateModel();
            //创建交换机
            channel.ExchangeDeclare("direct_Exchange", "direct", false, false, null);
            //创建队列
            channel.QueueDeclare("direct_queue1", false, false, false, null);
            channel.QueueDeclare("direct_queue2", false, false, false, null);
            channel.QueueDeclare("direct_queue3", false, false, false, null);

            //把队列绑定到交换机(就是队列订阅交换机)
            channel.QueueBind("direct_queue1", "direct_Exchange", "info", null);//设置routingkey(可不同的消息发往不同的队列)  info:为正常的消息
            channel.QueueBind("direct_queue2", "direct_Exchange", "warn", null);//warn:非正常的消息
            channel.QueueBind("direct_queue3", "direct_Exchange", "error", null);//error:错误的消息 

            for (int i = 0; i < 10; i++)
            {
                string msg = $"RabbiteMQ direct Message{i + 1}";
                var body = Encoding.UTF8.GetBytes(msg);
                //发送消息
                //根据已订阅交换机队列的routingkey指定发送消息
                channel.BasicPublish("direct_Exchange", "info", false, null, body);
                Console.WriteLine(msg);
            }
        }
    }

消费者

/// <summary>
    /// 路由模式-消费者
    /// </summary>
   public class DirectConsumer
    {
        /// <summary>
        /// 路由模式-消费者
        /// 消费者
        /// 通过管道向RabbitMQ获取消息且消费消息
        /// </summary>
        public static void ConsumerMessage()
        {
            //获取连接对象
            var connection = RabbitMQHelper.GetConnection();
            //创建管道
            var channel = connection.CreateModel();

            /*
             * 在消费者创建队列/交换机是以防范先启动消费者而引发报错
             * (如队列已存在的情况可不用再次创建/此创建为:确保先开启消费者,生产者未创建队列而引发报错)
            */

            //创建交换机
            channel.ExchangeDeclare("direct_Exchange", "direct", false, false, null);
            //创建队列
            channel.QueueDeclare("direct_queue1", false, false, false, null);
            channel.QueueDeclare("direct_queue2", false, false, false, null);
            channel.QueueDeclare("direct_queue3", false, false, false, null);
            //把队列绑定到交换机(就是队列订阅交换机)
            channel.QueueBind("direct_queue1", "direct_Exchange", "info", null);
            channel.QueueBind("direct_queue2", "direct_Exchange", "warn", null);
            channel.QueueBind("direct_queue3", "direct_Exchange", "error", null);

            //事件对象
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) => {
                //获取消息
                var body = ea.Body;//获取队列中消息主体
                var msg = Encoding.UTF8.GetString(body.ToArray());//转为string
                var routingkey = ea.RoutingKey;//队列名
                Console.WriteLine($"message is:{msg} ,routingkey => {routingkey}");
            };

            //消费消息
            //可一次消费多个队列消息(也可消费单个队列)
            channel.BasicConsume("direct_queue1", true, consumer);
            channel.BasicConsume("direct_queue2", true, consumer);
            channel.BasicConsume("direct_queue3", true, consumer);
        }
    }

10.主题模式

生产者

 /// <summary>
    /// 主题模式-生产者
    /// </summary>
   public class TopicProducer
    {
        /// <summary>
        /// 主题模式
        /// 生产者
        /// 设置交换机,创建多个队列,队列订阅交换机,生产者往交换机发送消息即可
        /// 给队列设置指定routingkey,发送消息时可通过订阅了交换机队列的routingkry指定发送给某个队列
        /// </summary>
        public void SendMessage()
        {
            //获取连接对象
            using var connection = RabbitMQHelper.GetConnection();
            //创建管道
            using var channel = connection.CreateModel();
            //创建交换机
            channel.ExchangeDeclare("topic_Exchange", "topic", false, false, null);
            //创建队列
            channel.QueueDeclare("topic_queue1", false, false, false, null);
            channel.QueueDeclare("topic_queue2", false, false, false, null);
            channel.QueueDeclare("topic_queue3", false, false, false, null);

            //把队列绑定到交换机(就是队列订阅交换机)
            channel.QueueBind("topic_queue1", "topic_Exchange", "user.insert", null);//设置routingkey(可不同的消息发往不同的队列)  info:为正常的消息
            channel.QueueBind("topic_queue2", "topic_Exchange", "user.update", null);//warn:非正常的消息
            //通配符: * 代表随意一个单词  # 代表任意组合词汇
            //(在添加其它队列时,符合通配符条件则这个队列消息也会添加进去)
            channel.QueueBind("topic_queue3", "topic_Exchange", "user.*", null);//error:错误的消息 

            for (int i = 0; i < 10; i++)
            {
                string msg = $"RabbiteMQ topic Message{i + 1}";
                var body = Encoding.UTF8.GetBytes(msg);
                //发送消息
                //根据已订阅交换机队列的routingkey指定发送消息
                channel.BasicPublish("topic_Exchange", "user.update", false, null, body);
                Console.WriteLine(msg);
            }
        }
    }

### 解决 IntelliJ IDEA 中 `@Autowired` 注解导致的红色波浪线错误 在使用 Spring 框架时,如果遇到 `@Autowired` 注解下的依赖注入对象显示为红色波浪线错误或者黄色警告的情况,通常是由以下几个原因引起的: #### 1. **Spring 插件未启用** 如果 Spring 支持插件未被激活,则可能导致 IDE 无法识别 `@Autowired` 或其他 Spring 特定的功能。可以通过以下方式解决问题: - 打开设置菜单:`File -> Settings -> Plugins`。 - 确认已安装并启用了名为 “Spring Framework Support” 的官方插件[^1]。 #### 2. **项目配置文件缺失或不正确** Spring 需要通过 XML 文件、Java Config 类或其他形式来定义 Bean 定义。如果没有正确加载这些配置文件,可能会导致 `@Autowired` 报错。 - 确保项目的 `applicationContext.xml` 或者基于 Java 的配置类(带有 `@Configuration` `@Bean` 注解)已被正确定义引入。 - 对于 Spring Boot 项目,确认是否存在 `spring.factories` 文件以及是否包含了必要的组件扫描路径[^3]。 #### 3. **模块依赖关系问题** 当前模块可能缺少对 Spring Core 或 Context 组件库的有效引用。这可能是由于 Maven/Gradle 构建工具中的依赖项声明不足造成的。 - 检查 `pom.xml` (Maven) 或 `build.gradle` (Gradle),确保包含如下核心依赖之一: ```xml <!-- For Maven --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> ``` ```gradle // For Gradle implementation 'org.springframework:spring-context:${springVersion}' ``` - 更新项目依赖树以应用更改:右键点击项目根目录 -> `Maven -> Reload Project` 或运行命令 `./gradlew build --refresh-dependencies`。 #### 4. **IDE 缓存损坏** Intellij IDEA 的缓存机制有时会因各种因素而失效,从而引发误报错误。清除缓存可以有效缓解此类情况。 - 使用快捷组合键 `Ctrl + Alt + Shift + S` 进入项目结构对话框;也可以尝试执行操作序列:`File -> Invalidate Caches / Restart... -> Invalidate and Restart`. #### 5. **启动异常影响正常解析** 若之前存在类似 `com.intellij.diagnostic.PluginException` 的严重初始化失败日志记录,则表明某些关键服务未能成功加载,进而干扰到后续功能表现[^2]。建议重新下载最新稳定版本的 IDEA 并按照标准流程完成初次部署工作。 ```java // 示例代码片段展示如何正确运用 @Autowired 注解实现自动装配 @Service public class StudentService { private final Repository repository; public StudentService(@Qualifier("specificRepository") Repository repo){ this.repository = repo; } } @Component class SpecificComponent{ @Autowired private transient StudentService studentService; // 此处应无任何编译期告警现象发生 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值