rabbitmq
Posted enhance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq相关的知识,希望对你有一定的参考价值。
1、 pom添加依赖
通用依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
2、 添加rabbitmq服务配置信息
# rabbitmq配置
spring:
rabbitmq:
addresses: 172.16.4.201
username: admin
password: [email protected]
3、 Rabbitmq三种交换机模式:
a) Direct Exchange
(直连):传递时需要一个Routekey,通过Routkey寻找对应队列;这种模式Exchange不需要绑定(binding)queue
例子:
BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);
b) Fanout Exchange
(广播):任何发送到Fanout Exchange的消息都会转发到与该Exchange绑定(bingding)的所有queue上;这种模式不需要routkey
例子:BindingBuilder.bind(queueA).to(fanoutExchange);
c) Topic Exchange
可以理解为direct exchange+fanout exchange;任何发送到Exchange的消息都会被转发所有关心Routekey中所指定的queue上;
需要指定routekey;exchange需要绑定(binding)queue;
模糊匹配:#表示0个或若干个关键字, “”表示一个关键字。如log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
例子:BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);
Rabbitmq消费者是按照广播消费还是集群消费完全是看发送者的exchange的。如下例子中: ①RabbitmqConfig类: //定义一个名字为Abc类型为FanoutExchange的交换机 @Bean FanoutExchange Abc() // 定义一个名为fanoutExchange的fanout交换器 return new FanoutExchange("Abc"); //交换机绑定三个队列fanoutA()、fanoutB()、fanoutC() @Bean public Binding bindingExchangeWithA() return BindingBuilder.bind(fanoutA()).to(fanoutExchange()); /** * 将定义的fanoutB队列与fanoutExchange交换机绑定 * @return */ @Bean public Binding bindingExchangeWithB() return BindingBuilder.bind(fanoutB()).to(fanoutExchange()); /** * 将定义的fanoutC队列与fanoutExchange交换机绑定
* fanout类型交换机的生产者发送时routkey为空,格式rabbitTemplate.convertAndSend(Exchange,"", content);这样可以将消息发送到在RabbitConfig类中所有绑定的queues上
* direct类型交换机生产者生产者发送时需要routkey,格式:RabbitTemplate.convertAndSend(EXCHANGE, ROUTINGKEY, content);这样之后将消息发送到routkey指定的queue上 * @return */ @Bean public Binding bindingExchangeWithC() return BindingBuilder.bind(fanoutC()).to(fanoutExchange()); ②生产者代码 public void fanoutSend() Date date = new Date(); String dateString = new SimpleDateFormat("YYYY-mm-DD hh:MM:ss").format(date); System.out.println("[fanout] send msg:" + dateString); // 注意 第一个参数是我们交换机的名称 ,第二个参数是routerKey 我们不用管空着就可以,第三个是你要发送的消息 this.rabbitTemplate.convertAndSend("Abc", "", dateString); //这里通过交换机名称确定发送消息时何种类型的。本例子中是Abc对应到RabbitConfig中Abc是广播类型,fanout交换机类型生产者无需routkey ③消费端代码 @Component @RabbitListener(queues = "fanout.a") //消费端通过queue名字找到对应绑定的交换机,然后判断是何种类型消费 public class FanoutAConsumer @Autowired private AmqpTemplate rabbitmqTemplate; /** * 消息消费 * @RabbitHandler 代表此方法为接受到消息后的处理方法 */ @RabbitHandler public void recieved(String msg) System.out.println("[fanout.a] recieved message:" + msg); @Component @RabbitListener(queues = "fanout.b") public class FanoutBConsumer @Autowired private AmqpTemplate rabbitmqTemplate; /** * 消息消费 * @RabbitHandler 代表此方法为接受到消息后的处理方法 */ @RabbitHandler public void recieved(String msg) System.out.println("[fanout.b] recieved message:" + msg);
以上是关于rabbitmq的主要内容,如果未能解决你的问题,请参考以下文章
RabbitMQRabbitMQ和Erlang下载与安装步骤—2023超详细最新版