RabbitMQ发送和接收消息的几种方式
创始人
2025-07-05 23:01:17
0

一、发送消息的几种方式

1.1、默认交换机和routingKey----(个人不推荐使用)

    使用默认的交换机exchange或routingKey。

图片图片

调用方法:

图片图片

1.2、使用指定routingKey的方式发送(默认的交换机)

    使用默认的交换机,routingKey必须为quenue队列的名称。

调用方法:

图片图片

案例:

/**
 * @Author yangyalin
 * @Description 测试发送消息(直接使用队列发送,使用默认的交换机) routingKey:即为对列的名称即可
 **/
public void testSendMsg(String message){
    rabbitTemplate.convertAndSend(RabbitMQConvertConfig.TEST_QUEUE,message);
}

1.3、指定交换机和routingKey的方式发送

    使用指定的交换机,若绑定routingKey,必须使用指定的模式;若没有绑定,可设置为""。

调用方法:

图片图片

案例:

public void sendDecreStockMessage(DecreStockFromRabbit decreStockFromRabbit){
    CorrelationData correlationData = new CorrelationData();
    correlationData.setId(decreStockFromRabbit.getMessageId());
  /**
   * exchange:交换机  routingKey:路由键  message:消息体内容   correlationData:消息唯一ID
  **/
    rabbitTemplate.convertAndSend(RabbitMQConvertConfig.ORDER_EXCHANGE,
        RabbitMQConvertConfig.ORDER_ROUTINGKEY, decreStockFromRabbit,correlationData);
}
或:
rabbitTemplate.convertAndSend("test-exchange","",message);

二、接收消息的几种方式

2.1、默认交换机,提前创建好队列(TestDirectQueue)

/**
     * 功能描述:当消费同一个队列的时候,可通过设置实现能则多劳,
     * 消息轮询方式订阅
     * @MethodName: process11
     * @MethodParam: [testMessage]
     * @Return: void
     * @Author: yyalin
     * @CreateDate: 2022/4/9 17:10
     */
    @RabbitListener(queues = "TestDirectQueue")   //监听的队列名称 TestDirectQueue
    public void process11(Map testMessage) throws InterruptedException {
        log.info("消费者收到消息222:" + testMessage.toString());
        Thread.sleep(200);
    }

2.2、默认交换机,自动创建队列(TEST_QUEUE2)

@RabbitListener(queuesToDeclare=@Queue(TopicExchangeConfig.TEST_QUEUE2))
@RabbitHandler
public void receiveTestMsg2(@Payload String str) throws Exception{
    log.info("开始接收消息。。。。。");
    log.info("接收到的消息:"+str);
}

2.3、自动创建交换机和队列----(个人推荐)

    自动创建且交换机和队列绑定,key可指定也可不指定(默认为队列名称)。

/******************方案二:使用注解的方式绑定队列在交换机上*******************/
    @RabbitListener(bindings = @QueueBinding(value=@Queue(name="directQueue"),
            exchange=@Exchange(name="directExchange",type = ExchangeTypes.DIRECT),
            key={"red", "blue"}
    ))    //监听的队列名称 TestDirectQueue
    public void directConsumer(String message) {
        log.info("消费者收到direct消息555  : " + message);
    }


   @RabbitListener(bindings = @QueueBinding(value=@Queue(name="topicQueue2"),
            exchange=@Exchange(name="topicExchange",type = ExchangeTypes.TOPIC,ignoreDeclarationExceptions = "true"),
            key="#.new"
    ))
    public void topicConsumer2(String message) {
        log.info("消费者收到topic消息888  : " + message);
    }

备注:ignoreDeclarationExceptions = "true" : 即使配置出现了错误也不至于整个应用程序都启动失败的情况。

1、channel.basicQos(0, 1, false):0表示对消息的大小无限制,1表示每次只允许消费一条,false表示该限制不作用于channel。

同时,我们采用手工ACK的方式,因为我们配置文件配置了   spring.rabbitmq.listener.simple.acknowledge-mode=manual:

2、channel.basicAck(deliveryTag, false):deliveryTag表示处理的消息条数(一般为1),从heaers中取,false表示不批量ack。

/**
     * 功能描述: 消费端加上手动确认消息被接收
     * @MethodName: process
     * @MethodParam: [message]
     * @Return: void
     * @Author: yyalin
     * @CreateDate: 2022/4/18 19:10
     */
    @RabbitListener(queues = "TestDirectQueue3")    //监听的队列名称 TestDirectQueue
    public void process(String message, Channel channel) throws IOException {
        log.info("DirectReceiver消费者收到消息1  : " + message);
        long msgId=1111L; //消息ID
        try {
            //手动确认消息已消费
            channel.basicAck(msgId,false);
        } catch (IOException e) {
            //把消息失败的消息重新放入到队列
            channel.basicNack(msgId,false,true);
            e.printStackTrace();
        }
    }

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...