输入图片说明

  1. 如上图生产者消费者模型添加一个队列,并创建两个消费者用于监听队列消息我们发现,当有消息到达时,两个消费者会交替收到消息。这一过程虽然不用创建交换机,但会使用默认交换机,并用默认的直连(defaultdirect策略连接队列;

下面来看具体真使用

1.安装,关于安装之前已经介绍过了,有兴趣的话,可以参考之前的文章

PHP安装rabbitmq扩展_php 按照rabbitmq 扩展-CSDN博客

不过使用的是php版本的,原理上是一样的。

安装好之后我们打开后台

 1.yml文件配置rabbitmq

server.port=8081
logging.path=D:/
logging.level.boot.spring=DEBUG
spring.application.name=spring-boot-rabbitmq
spring.rabbitmq.host=192.168.33.10
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=test123

pom文件添加依赖

<dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-amqp</artifactId>
	        <version>1.5.10.RELEASE</version>
	    </dependency>

生产者

@Transactional
@Service("producer")
public class ProducerImpl implements Producer{
	@Autowired
	RabbitTemplate rabbitTemplate;
	public void sendMail(String queue,Mail mail) {
		rabbitTemplate.setQueue(queue);
		rabbitTemplate.convertAndSend(queue,mail);
	}

}

 消费者

@Configuration
public class ProducerConsumerConfig {
	
	 	@Bean
	    public Queue myQueue() {
	       Queue queue=new Queue("myqueue");
	       return queue;
	    }
	    
}

将队列绑定交换机

@Configuration
public class DirectExchangeConfig {
	@Bean
 	public DirectExchange directExchange(){
		DirectExchange directExchange=new DirectExchange("direct");
 		return directExchange;
 	}
	
	@Bean
    public Queue directQueue1() {
       Queue queue=new Queue("directqueue1");
       return queue;
    }
	
 	//将交换机和相应队列连起来
 	@Bean
 	public Binding bindingorange(){
 		Binding binding=BindingBuilder.bind(directQueue1()).to(directExchange()).with("orange");
 		return binding;
 	}
}

写个控制器

@Controller
public class RabbitMQController {
	
	
	@Autowired
	ProducerImpl producer;
	
	@Autowired
	PublisherImpl publisher;
	
	@RequestMapping(value="/produce",produces = {"application/json;charset=UTF-8"})
	@ResponseBody
	public void produce(@ModelAttribute("mail")Mail mail) throws Exception{
		producer.sendMail("myqueue",mail);
	}
  }

 通过监听器监听消费:

@Component
public class DirectListener1 {
	@RabbitListener(queues = "directqueue1")
	public void displayMail(Mail mail) throws Exception {
		System.out.println("directqueue1队列监听器1号收到消息"+mail.toString());
	}
}

启动项目我们调用一下:

 看到队列的消费情况:

篇文章介绍 rocketmq,这2种消息队列在实际应用中都等起道会很好的作用,但在实际应中,rocketmq使用java语言开发的,跨平台比较好。rabbitmq 架构设计简单,在一般的轻量级服务用用中,可能比较好些。官方的对比也给了说明

用于易用性和灵活性要求较高的场景

1、应用场景

2.RocketMQ:

适用于大规模数据处理和高吞吐量的场景

2、服务架构

  1. Channel通道):Channel是RabbitMQ与应用程序之间虚拟连接。通过在物理连接connection)上创建多个通道应用程序可以并发地进行消息传递操作通道负责发送接收消息,并执行一些与消息相关的操作,如声明队列、定义交换机和绑定等。通道可以看作是轻量级会话,通过一个物理连接与RabbitMQ进行交互
  2. Exchange(交换机):交换机是消息的接收转发中心。当消息发送到RabbitMQ时,会通过交换机进行路由交换机根据其类型和绑定规则,将消息路由到一个或多个队列中常见交换类型包括直连交换机(direct)、主题交换机(topic)、扇形交换机(fanout)和头部交换机(headers)。
  3. Queue(队列):队列是RabbitMQ用于存储消息的缓冲区。当消息无法立即路由到消费者时,会被存储在队列中等待消费者来获取和处理。每个队列都有一个唯一名称,并且按照FIFO(先进先出)的顺序进行消息的投递和消费。
  4. Virtual Host(虚拟主机):虚拟主机是逻辑上的隔离环境,用于将RabbitMQ服务器分为多个独立部分每个虚拟主机都有自己的交换机、队列、绑定和权限设置虚拟主机可以帮助不同应用程序服务之间进行隔离,并提供安全性资源管理控制
  5. Broker(代理):Broker是RabbitMQ消息队列服务器实例负责接收存储和路由消息。它充当中间人的角色,将生产者发送消息传递给消费者。一个RabbitMQ实例可以包含多个Broker,每个Broker可以承载多个虚拟主机和队列。

  1. NameServer(命名服务器):NameServer是RocketMQ的命名服务组件,用于管理和提供Broker的路由信息。它充当元数据中心负责维护Broker的注册信息、Topic的路由信息等。Producer和Consumer在发送接收消息之前,需要与NameServer进行交互获取正确的Broker信息
  2. Controller(控制器):Controller是RocketMQ的控制组件负责协调和管理整个RocketMQ集群工作。它监控Broker的状态变化,处理集群扩容和缩容,进行负载均衡等操作。Controller是RocketMQ集群的核心组件之一,确保集群的可靠运行自动化管理
  3. Broker(代理):Broker是RocketMQ的消息存储和处理节点。它负责接收来自Producer的消息,并将其存储磁盘上。Broker还负责处理Consumer的消息拉取请求,并将消息推送给Consumer进行消费。一个RocketMQ集群可以包含多个Broker,每个Broker负责存储部分Topic的消息数据

原文地址:https://blog.csdn.net/lchmyhua88/article/details/134762560

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36982.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注