3.Rabbit MQ 代码(简单实现)

  1. 导入 pom.xml 包(也可以在创建 springboot 工程时自带)
    1. <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-amqp</artifactId>
      </dependency>

       

  2. Rabbit Mq 加载配置
    1. package com.ky.config;
      
      
      import org.springframework.amqp.core.Binding;
      import org.springframework.amqp.core.BindingBuilder;
      import org.springframework.amqp.core.DirectExchange;
      import org.springframework.amqp.core.FanoutExchange;
      import org.springframework.amqp.core.Message;
      import org.springframework.amqp.core.Queue;
      import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
      import org.springframework.amqp.rabbit.connection.CorrelationData;
      import org.springframework.amqp.rabbit.core.RabbitTemplate;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class RabbitmqConfig {
      	
      	@Autowired
      	private CachingConnectionFactory connectionFactory;
      
      	//点对点队列名
      	public static final String DIR_SELFHELP_QUERY_NAME = "self.help.dir.queue";
      
      	//点对多队列名
      	public static final String FUN_SELFHELP_QUERY_NAME = "self.help.fun.queue";
      	
      	//点对点交换机名
      	public static final String DIRECTEXCHANGE = "self.help.dirExchange";
      	
      	//点对多交换机名
      	public static final String FANOUTEXCHANGE = "self.help.fanExchange";
      	
      	//绑定id
      	public static final String IMMEDIATE_ROUTING_ID = "self.help.immediate.routing";
      	
      	
      	//创建一个点对点消费的队列
      	@Bean
      	public Queue directImmediateQueue() {
      		// 第一个参数是创建的 queue 的名字,第二个参数是否支持持久化
      		return new Queue(DIR_SELFHELP_QUERY_NAME, false);
      	}
       
      	//创建一个点对多消费的队列
      	@Bean
      	public Queue fanoutImmediateQueue() {
      		return new Queue(FUN_SELFHELP_QUERY_NAME, false);
      	}
      	
      	//点对点交换机
      	@Bean
      	public DirectExchange derectImmediateExchange() {
      		/**
      		 *  一共有三种构造方法
      		 *  第一种:可以只传 exchange 的名字
      		 *  第二种:可以传 exchange 名字,是否支持持久化,是否可以自动删除
      		 *  第三种在第二种参数上可以增加 Map,Map 中可以存放自定义 exchange 中的参数
      		 */
      		return new DirectExchange(DIRECTEXCHANGE, true, false);
      	}
      	
      	//点对多交换机
      	@Bean
      	public FanoutExchange fanoutImmediateExchange() {
      		return new FanoutExchange(FANOUTEXCHANGE, true, false);
      	}
      	
      	//点对点绑定
      	@Bean
      	public Binding immediateBinding() {
                  // 把点对点消费的队列和点对点消费的交换机绑定在一起
      		return BindingBuilder.bind(directImmediateQueue()).to(derectImmediateExchange()).with(IMMEDIATE_ROUTING_ID);
      	}
      	
      	//点对多绑定
      	@Bean
      	public Binding FunImmediateBinding() {
                   // 把点对点消费的队列和点对点消费的交换机绑定在一起
      		return BindingBuilder.bind(fanoutImmediateQueue()).to(fanoutImmediateExchange());
      	}
      
      	//消息监听
      	@Bean
      	public RabbitTemplate RabbitTemplate() {
      		connectionFactory.setPublisherConfirms(true);
      		connectionFactory.setPublisherReturns(true);
      		RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
      		rabbitTemplate.setMandatory(true);
      		rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
      			
      			@Override
      			public void confirm(CorrelationData correlationData, boolean ack, String cause) {
      				// TODO Auto-generated method stub
      				System.out.println("消息发送成功");
      			}
      		});
      		rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
      			
      			@Override
      			public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
      				// TODO Auto-generated method stub
      				System.out.println("消息丢失");
      			}
      		});
      		return rabbitTemplate;
      	}
      }

       

  3. Rabbit Mq 发送以及消费
    1. 点对点发送
      1. @Component
        public class Sender {
        	@Autowired
        	RabbitTemplate rabbitTemplate;
        	
        	public void send(String message) {
                     // 第一个参数是要绑定的交换机,第二个参数是点对点的 ID,第三个参数是要传输的信息
        		rabbitTemplate.convertAndSend(RabbitmqConfig.DIRECTEXCHANGE, RabbitmqConfig.IMMEDIATE_ROUTING_ID, message);
        	}
        }

         

    2. 点对多发送
      1. @Component
        public class Sender {
        	@Autowired
        	RabbitTemplate rabbitTemplate;
        	
        	public void send(String message) {
                     // 第一个参数是要绑定的交换机,第二个参数会自动忽略,第三个参数是信息
        		rabbitTemplate.convertAndSend(RabbitmqConfig.FANOUTEXCHANGE, RabbitmqConfig.IMMEDIATE_ROUTING_ID, message);
        	}
        }

         

    3. 消费
      1. @Component
        public class Receiver {
        
        	@RabbitHandler
             // queues = 消费的队列
        	@RabbitListener(queues = RabbitmqConfig.FUN_SELFHELP_QUERY_NAME)
        	public void immediateProcess(String message) {
        		System.out.println(message);
        	}
        }
RabbitMQ是一个基于AMQP(高级消息队列协议)的消息中间件系统,广泛应用于构建分布式应用、处理异步任务等场景。如果你遇到生产者发送消息到RabbitMQ后,消息中心没有任何响应的情况,这里有几个常见原因及解决方案: ### 1. 检查配置文件 首先确认是否正确设置了RabbitMQ的监听端口、用户名密码以及是否允许外部连接。如果服务器配置错误,例如防火墙阻止了外部连接或使用的用户权限不足,可能导致消息无法到达RabbitMQ。 #### 相关问题: - **如何检查并调整RabbitMQ服务的端口设置?** ### 2. 检查网络连接 确保生产者应用程序能够正常访问RabbitMQ服务器。这涉及到检查网络连通性、DNS解析、路由表等。可以尝试从生产者所在的机器ping RabbitMQ服务器地址,验证网络是否可达。 #### 相关问题: - **如何测试本地到RabbitMQ服务器的网络连通性?** ### 3. 消息路由和交换机设置 检查消息通过的交换机(exchange)是否配置正确。错误的binding键或绑定策略可能会导致消息未送达正确的队列。确保生产者使用的routing key与接收者期望的匹配,并且正确地绑定了交换机。 #### 相关问题: - **如何查看和修改RabbitMQ中交换机和队列的绑定信息?** ### 4. 消费者设置 确认消费者(consumer)部分正确处理消息。这包括了消费者的启动脚本、配置文件和代码中对RabbitMQ连接的建立。消费者应该能正确接受来自RabbitMQ的消息。 #### 相关问题: - **如何检查RabbitMQ消费者部分的配置和代码实现?** ### 5. 检查日志 最后,查阅RabbitMQ服务器的日志文件(通常位于`/var/log/rabbitmq`目录下)可以帮助定位问题所在。特别是检查错误信息,它们通常会提供关于消息传输失败的具体原因。 ### 解决步骤总结: 1. 验证RabbitMQ服务器配置无误,包括端口、用户名、密码以及是否允许外部访问。 2. 确认网络连通性良好。 3. 查看并正确配置消息路由和交换机绑定。 4. 核实消费者部分的配置和代码实现。 5. 分析日志文件获取故障详情。 通过以上步骤逐一排查,应该能找到并解决“消息生产后RabbitMQ没有反应”的问题。如果有更具体的错误信息或者环境细节,可能需要进一步调试以获得精确的诊断结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值