MQ

消息应答机制:消费者在接收到消息并且处理该消息之后,告诉rabbitmq他已经处理了,rabbitmq可以把该消息删除了。

  自动应答:生产者消息发出,就认为发送消息成功。消费者如果消费失败,这条数据就丢失了。--适合高吞吐量但数据安全性不高的。

  手动应答:消费者确认消费了,才将这条信息进行删除

 

交换机类型:直接(direct) 主题(topic) 标题(headers) 扇出(fanout)

 

fanout:直接将队列和交换机进行绑定,不需要路由key的存在,类似广播的形式。

direct:通过路由key进行绑定,但是路由key不支持通配

topic:通过路由key进行绑定,路由key支持通配,*代表一个单词,#代表零个或者多个单词。

 

生产者:

复制代码
@Configuration
public class config {

    public static final String EXCHANGE_NAME = "boot_topic_exchange";

    public static final String QUEUE_NAME = "boot_queue";
    //1.交换机
    @Bean
    public Exchange bootExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }


    //2.Queue 队列
    @Bean
    public Queue bootQueue(){
        return QueueBuilder.durable(QUEUE_NAME).build();
    }

    //3.队列和交换机的绑定
    @Bean
    public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue, @Qualifier("bootExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("ideal.#").noargs();
    }
}
复制代码

 

复制代码
spring.application.name=springboot-rabbitmq

spring.rabbitmq.host=127.0.0.1

spring.rabbitmq.port=5672

spring.rabbitmq.username=guest

spring.rabbitmq.password=guest

spring.rabbitmq.virtual-host=/

spring.rabbitmq.listener.direct.acknowledge-mode=manual
复制代码
复制代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test1 {

    @Autowired
    private  RabbitTemplate rabbitTemplate;

    @Test
    public  void testSend(){
        for (int i = 0; i < 30 ; i++) {
            rabbitTemplate.convertAndSend(config.EXCHANGE_NAME,"hhhhhhhh");

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }
复制代码

 

 

 

消费者:

@Component
public class RabbitMQListener {
    @RabbitListener(queues = "boot_queue")
    public void ListenerQueue(Message message){
        System.out.println("开始打印接收");
        System.out.println(new String(message.getBody()));
    }
}
复制代码
spring.application.name=springboot-rabbitmq

spring.rabbitmq.host=127.0.0.1

spring.rabbitmq.port=5672

spring.rabbitmq.username=guest

spring.rabbitmq.password=guest

spring.rabbitmq.virtual-host=/

spring.rabbitmq.listener.direct.acknowledge-mode=manual
复制代码
RabbitListener会自动创建连接,队列、交换机等等。

 

 

 

================================================================================

            高级特性

1.消息的可靠投递

  在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式。

    》confirm确认模式

    》return退回模式

  rabbitmq整个消息投递的路径为:producer---->rabbitmq broker----->exchange------->queue------->consumer

    消息从producer到exchange则会返回一个confirmCallback。

    消息从exchange---->queue投递失败则会返回一个returnCallback。

  我们将利用这两个callback控制消息的可靠性投递

 

 

  确认模式的开启

  》1.配置文件中声明publisher-confirm-type:correlated开启确认模式

  》2.定义回调:rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback())匿名内部类重写confirm方法

 

  回退模式的开启

  》1.配置文件中声明publisher-returns="true"开启回退模式

  》2.定义回调:rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback())匿名内部类重写returnedMessage方法,模式是直接丢弃消息,方法不会被调用。使用rabbitTimplate.setMandatory(true)设置开启交换机处理失败消息的模式。

posted @   WXY_WXY  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示