的账号. 13 spring.rabbitmq.username=guest 14 # rabbitmq的密码. 15 spring.rabbitmq.password=guest 16 17 # 设置交换器的名称...,方便修改. 18 # 生产者和消费者的交换器的名称是一致的,这样生产者生产的消息发送到交换器,消费者可以从这个交换器中消费. 19 rabbitmq.config.exchange=order.exchange.fanout...的账号. 13 spring.rabbitmq.username=guest 14 # rabbitmq的密码. 15 spring.rabbitmq.password=guest 16 17 # 设置交换器的名称...,方便修改. 18 # 路由键是将交换器和队列进行绑定的,队列通过路由键绑定到交换器. 19 rabbitmq.config.exchange=order.exchange.fanout 20 21...24 * 4、@Exchange value:为交换器起个名称、type:指定具体的交换器类型 25 * 26 * 27 */ 28 @Component 29 @RabbitListener
备胎交换器简称AE,生产者在发送消息的时候如果不设置mandatory参数,那么消息在未被路由的情况下将会丢失;如果设置了mandatory参数,那么需要添加reutrnListener的编程逻辑。...生产者的代码将变得复杂,如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以备份交换器,这样可以将未被路由的消息存储在rabbitmq中,再需要的时候再去处理这些消息。...我们可以在定义交换器的时候添加alternate-exchange参数来实现。...”); channel.queueBind(”b”,”bb”,””); 如上图所示,当消息发送到交换机A的时候,如果路由键为aaa那么就发送到AA的消息队列中,如果路由键不是aaa,那么就发送到备胎交换器...BindingBuilder.bind(exchangeB).to(exchangeA).with(""); } @Test public void testAE(){ //设置消息相关属性
正文 在实现之前我要介绍一个重要的参数 mandatory mandatory翻译成“强制的”,参数设置 true 时,交换器无法根据自身类型和路由键找到一个符合条件的队列,那么该消息会返回给生产者。...当参数设置 false 时,出现上述情况,消息会被丢弃。 把参数设置 true,然后添加ReturnListener的编程逻辑就可以通过消息回调方式保证消息的可靠性。...alternate-exchange 下面介绍第二种方法,可以通过在声明交换器的时候设置 alternate-exchange 参数来实现,这样处理代码逻辑更简洁,本文的案例也是通过这种方式实现的。...备份交换器和普通交换器一样,建议设置为 fanout 类型,你也可以设置direct或者topic,但是重新发送给备份交换器时路由键也要匹配上,我们设置备份交换器就是说在路由键没有匹配上才有意义,所以没必要设置...这样就实现了成功路由和备份交换器的路由 注意以下情况 如果设置的备份交换器不存在、备份交换器没有绑定任何队列、备份交换器绑定了队列但是没有匹配到,以上三种情况,客户端和服务端都不会出现异常,消息会丢失。
1、Topic交换器(主题,规则匹配),Topic交换器也称为主题交换器,特点是根据规则进行匹配,可以根据模糊进行匹配(即根据路由key进行模糊匹配),决定将那个信息放入到指定的队列里面去。 ?...的账号. 13 spring.rabbitmq.username=guest 14 # rabbitmq的密码. 15 spring.rabbitmq.password=guest 16 17 # 设置交换器的名称...,方便修改. 18 # 生产者和消费者的交换器的名称是一致的,这样生产者生产的消息发送到交换器,消费者可以从这个交换器中消费. 19 rabbitmq.config.exchange=log.exchange.topic...不同的日志级别信息指定好路由键,将发送的消息绑定到交换器上面,发送消息。...的账号. 13 spring.rabbitmq.username=guest 14 # rabbitmq的密码. 15 spring.rabbitmq.password=guest 16 17 # 设置交换器的名称
一、交换器类型 在rabbitmq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列中去,在分发的过程中交换器类型会影响分发的逻辑。...channel.queueDeclare("queueName"); //创建一个队列 channel.queueBind("queueName", "exchangeName", "zhangsna"); //绑定并设置路由键...channel.queueBind("queueName", "exchangeName", "lisi"); //绑定并设置路由键 channel.queueBind("queueName",..."exchangeName", "wangwu"); //绑定并设置路由键 当生产者发送了一条routeting为zhangsan的消息到交换器中,交换器在分发的时候只会把消息分发到队列一里面去,因为交换器在...,它不依赖与bindingKey和routingKey,而是在绑定队列与交换器的时候指定一个键值对;当交换器在分发消息的时候会先解开消息体里的headers数据,然后判断里面是否有所设置的键值对,如果发现匹配成功
在之前的章节中我们改进了我们的日志系统,我们使用direct型交换器代替了只能盲目广播消息的fanout型交换器,这使得我们可以有选择性地接收日志。...为在我们的日志系统实现这个,我们还需要再学习一个更加复杂的交换器类型——Topic型交换器。 发送到Topic型交换器的消息不能包含任意路由键——它必须是一串字符并且以圆点符号隔开。...备注: Topic型交换器比较强大跟其它交换器很相似。 当一个队列以”#”作为绑定键时,它将接收所有消息,而不管路由键如何,类似于fanout型交换器。...当特殊字符”*”、”#”没有用到绑定时,topic型交换器就好比direct型交换器了。 揉在一起 我们将在我们的日志系统中使用topic型交换器。...", os.Args[0]) os.Exit(0) } //为每条消息设置单独绑定 for _, s := range os.Args[1:] { log.Printf("Binding
交换器介绍 RabbitMQ中有三种主要的交互器分别如下 交换器 说明 direct 发布与订阅 完全匹配 fanout 广播 topic 主体,规则匹配 Fanout FanoutExchange...192.168.88.150 spring.rabbitmq.port=5672 spring.rabbitmq.username=dpb spring.rabbitmq.password=123 #设置交换器的名称...Component public class Sender { @Autowired private AmqpTemplate rabbitAmqpTemplate; //exchange 交换器名称...; /* * 发送消息的方法 */ public void send(String msg){ //向消息队列发送消息 //参数一:交换器名称
交换器介绍 RabbitMQ中有三种主要的交互器分别如下 交换器 说明 direct 发布与订阅 完全匹配 topic 主体,规则匹配 fanout 广播 topic介绍 TopicExchange...192.168.88.150 spring.rabbitmq.port=5672 spring.rabbitmq.username=dpb spring.rabbitmq.password=123 #设置交换器的名称...192.168.88.150 spring.rabbitmq.port=5672 spring.rabbitmq.username=dpb spring.rabbitmq.password=123 #设置交换器的名称...; /* * 发送消息的方法 */ public void send(String msg){ //向消息队列发送消息 //参数一:交换器名称...; /* * 发送消息的方法 */ public void send(String msg){ //向消息队列发送消息 //参数一:交换器名称
配置完成之后我们启动Spring容器,容器启动后,我们定义的队列也好,交换器也好,都会自动为我们创建。这就是Spring AMQP封装的自动创建队列。...如果我们要自己实现配置化自动创建队列,交换器如何实现呢?下面我们会细细将来。 #什么是RabbitAdmin? RabbitAdmin是Spring AMQP封装的一个对象。...map = new HashMap(); map.put("x-dead-letter-exchange", "dead_letter_exchange");//设置死信交换机...map.put("x-dead-letter-routing-key", "mail_queue_fail");//设置死信routingKey Queue queue = new Queue...this.applicationContext.getBeansOfType(Binding.class).values()); 通过代码片段,我们可以看到,RabbitAdmin初始化的时候会从spring容器里取出所有的交换器
交换器介绍 RabbitMQ中有三种主要的交互器分别如下 交换器 说明 direct 发布与订阅 完全匹配 fanout 广播 topic 主体,规则匹配 direct案例 DirectExchange...spring-boot-starter-amqp 1.2参数设置...192.168.88.150 spring.rabbitmq.port=5672 spring.rabbitmq.username=dpb spring.rabbitmq.password=123 #设置交换器的名称...* * @Queue value:配置队列名称 * autoDelete:是否是一个可删除的临时队列 * * @Exchange value:为交换器起个名称 * type:指定具体的交换器类型...192.168.88.150 spring.rabbitmq.port=5672 spring.rabbitmq.username=dpb spring.rabbitmq.password=123 #设置交换器的名称
channel.basicReject(long deliveryTag, boolean requeue),参数1:消息的id;参数2:处理消息的方式,如果是true,Rabbib会重新分配这个消息给其他订阅者,如果设置成...+ message); } }; channel.basicConsume(queueName, true, consumer); 扩展部分—自定义线程池 如果需要更大的控制连接,用户可自己设置线程池...{ this.sharedExecutor = executor; } 其中this.sharedExecutor就是默认的线程池,可以通过setSharedExecutor()方法设置...ConnectionFactory的线程池,如果不设置则为null。...用户如果自己设置了线程池,像本小节第一段代码写的那样,那么当连接关闭的时候,不会自动关闭用户自定义的线程池,所以用户必须自己手动关闭,通过调用shutdown()方法,否则可能会阻止JVM的终止。
概要 AMQP-0-9-1中提供了queue.bind方法用于绑定一个队列到一个交换器,然后发送消息的时候,数据流总是先通过交换器(source)最终到达目标队列中(destination)。...RabbitMQ实现了扩展,为交换器提供了一个exchange.bind方法用于绑定一个交换器到另一个交换器。交换器之间的绑定和队列与交换器的绑定在语义上是相同的:单向的、使用路由键和多种交换器类型。...exchange.bind方法中的source和destination反映了消息的流向:从源(source)交换器到目标(destination)交换器。...使用了auto-delete参数声明的交换器只有它关联的所有绑定关系都移除(不管是交换器之间的绑定还是交换器和队列的绑定),它自身才会被删除。...RabbitMQ中还提供了一个exchange.unbind方法进行交换器之间绑定关系的解除。
交换器的相关操作 交换器的相关操作主要包括交换器的声明和删除。...交换器的被动声明 交换器的被动声明类似于队列的被动声明,用于通过交换器名称检查是否存在对应的交换器,依赖于Channel的exchangeDeclarePassive方法: Exchange.DeclareOk...交换器的删除依赖于Channel的exchangeDelete方法,方法只依赖于交换器的名称。...exchangeBind方法,声明交换器和交换器之间的绑定关系。 同时也提供解除绑定的方法: queueUnbind方法:解除队列和交换器的绑定关系。...我们先预先建立一个Fanout类型的交换器,命名为throwable.exchange.fanout,接着,我们把Fanout类型的交换器throwable.exchange.fanout作为来源交换器
很尴尬,发了并发编程的26和27,漏了本篇25。这下子我是真的没存货了哈哈。那下面我们来补上25先,25比较短小...勿喷。
控制台运行如下 创建交换器,队列 具体方法 amqpAdmin.declareExchange() amqpAdmin.declareQueue() amqpAdmin.declareBinding()...总结 本文通过@RabbitListener用监听rabbitmq的队列和使用amqpAdmin创建交换器,队列。 希望以上对你学习有用 再自我介绍一下吧。我叫润森,是一个的学习者。
的账号. 14 spring.rabbitmq.username=guest 15 # rabbitmq的密码. 16 spring.rabbitmq.password=guest 17 18 # 设置交换器的名称...,方便修改. 19 # 生产者和消费者的交换器的名称是一致的,这样生产者生产的消息发送到交换器,消费者可以从这个交换器中消费. 20 rabbitmq.config.exchange=log.exchange.direct...21 22 # 生产者生产消息的时候也要带上路由键,队列通过路由键绑定到交换器,交换器根据路由键将绑定到队列上. 23 # 交换器根据不同的路由键将消息发送到不同队列上. 24 # info的路由键...本模块练习的是发布订阅模式即Direct,分为两个生产者LogInfo、LogError,生产者生产消息的时候也要带上路由键,队列通过路由键绑定到交换器(即交换器根据路由键将绑定到队列上),交换器根据不同的路由键将消息发送到不同队列上...的账号. 13 spring.rabbitmq.username=guest 14 # rabbitmq的密码. 15 spring.rabbitmq.password=guest 16 17 # 设置交换器的名称
Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法: exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程,...e.printStackTrace(); } }).start(); } } 以上程序的执行结果如下: 总结 Exchange 交换器是用来实现两个线程间的数据交换的
) 5.queue.declare 创建队列 必须先取消订阅并将信道设置为 传输 模式。...","路由键") exchange.declare (创建队列设置合适参数) fanout (将接收到的消息绑定到队列上 发送到所有指定交换器的队列,用于同一条消息,需要多种操作) topic (来自不同源头的消息达到同一个队列...abc.abc模糊匹配 #匹配所有") 交换器、队列、绑定 根据绑定规则将队列绑定到交换器 消息发布到交换器 三种类型 基于路由键和交换器类型,服务器决定将消息投递到哪个队列 7.vhost..., 原因在于参数 durable 为 false 持久化 将 队列 与 交换器 durable 设置为 true 将消息队列的投递模式 delivery mode 设置为 2 标记持久化 (必须使用持久化投递模式...2 发布到持久化的交换器 到达 发布到持久化的队列) 将信道设置成事务模式 9.rabbitmq 启动 .
如果两者同时使用,则前者的优先级更高,会覆盖掉Policy的设置。 使用参数设置的关键代码如代码清单2所示。...normalExchange和myAe,分别绑定了normalQueue和unroutedQueue这两个队列,同时将myAe设置为normalExchange的备份交换器。...图2 备份交换器 同样,如果采用Policy的方式来设置备份交换器,可以参考如下: rabbitmqctl set_policy AE "^normalExchange$" ‘{"alternate-exchange...": "myAE"}’ 备份交换器其实和普通的交换器没有太大的区别,为了方便使用,建议设置为fanout类型,如若读者想设置为direct或者topic的类型也没有什么不妥。...对于备份交换器,总结了以下几种特殊情况: 如果设置的备份交换器不存在,客户端和RabbitMQ服务端都不会有异常出现,此时消息会丢失。
领取专属 10元无门槛券
手把手带您无忧上云