rabbitmq spring api

RabbitMQ消息确认机制
本文介绍RabbitMQ中消息的发布确认、消息接收确认机制及如何配置生产者和消费者的连接参数。包括如何使用Spring Boot进行消息队列的声明、消息发送及监听消费等关键步骤。

1 连接 (消费者和接受者都需要使用)

@Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses("127.0.0.1");
        connectionFactory.setHost("5672");
        connectionFactory.setUsername("jack");
        connectionFactory.setPassword("123456");
        connectionFactory.setVirtualHost("/");
        connectionFactory.setPublisherConfirms(true); // publisher确认模式
        connectionFactory.setPublisherReturns(true); // publisher没有路由返回
        connectionFactory.setConnectionTimeout(6 * 1000);  //ting.cai 1212 超时6s
        return connectionFactory;
    }


2 消费者


public class Receiver implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        System.out.println(" 消费者接收到消息:" + new String(message.getBody(),"utf-8"));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);// 手动确认消息收到ack
    }
}


@Bean
    Receiver receiver(){
        return new Receiver();
    }


    @Bean
    SimpleMessageListenerContainer myListenerContainer(ConnectionFactory connectionFactory,
                                             Receiver receiver) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("myQueue");
        container.setMessageListener(receiver);

//  NONE 和自动差不多,只不过broker认为consumer是不会发送任何ack  

        //  MANUAL 手动  AUTO 自动确认,onMessage()方法抛出异常例外
        container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        return container;
    }


3 生产者


3.1 channel的缓存

@Bean
RabbitTemplate myTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        return template;
}


实际上是一个channel的缓存,默认有25个channel,发送消息时,会从缓存中取空闲的channel,底层再通过channel发送

注意:设置的确认回调方法会被template里面所有缓存channel所共有,所以必须考虑所有使用这个template发送消息业务是否兼容这个回调

所以我建议对于使用confirm回调,本业务的发送和确认回调监听应该使用使用connectionfactory重新创建一个template


myTemplate.setConfirmCallback((CorrelationData correlationData, boolean ack, String errorMsg) -> {
      if(ack){
            System.out.println("ack==> confirm:correlationData=" + correlationData.getId() + " ack= " + ack);

            unAckMessageMap.remove(correlationData.getId());

      }

}


无法投递到queue的回调也有同样channel缓存问题

myTemplate.setMandatory(true);// 强制投递,投递不到queue才会回调

myTemplate.setReturnCallback((Message message, int replyCode, String replyText,
                                      String exchange, String routingKey)->{
            
 });


3.2 申明broker的queue、exchange、binding

@Bean
    public Queue myQueue(){
        return new  Queue("myQueue");
    }


    @Bean
    DirectExchange myExchange() {
        return new DirectExchange("myExchange");
    }


    @Bean
    Binding myBinding(Queue myQueue, DirectExchange myExchange) {
        return BindingBuilder.bind(myQueue).to(myExchange).with("myRoutingKey");
    }

    // AmqpAdmin会激活queue,binding,exchange,否则未激活状态
    @Bean
    public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory,
                                Queue myQueue,
                               DirectExchange myExchange,
                               Binding myBinding) {
        RabbitAdmin rabbitAdmin =  new RabbitAdmin(connectionFactory);


        // 如果队列不存在,可以自动创建一个
        rabbitAdmin.declareQueue(myQueue);
        rabbitAdmin.declareExchange(myExchange);
        rabbitAdmin.declareBinding(myBinding);
        return rabbitAdmin;
    }

3.3 发送

String id = getId();
// 指定投递的exchage和路由键
myTemplate.convertAndSend("myExchange","myRoutingKey","hello the world {id = " +  id + "}", new CorrelationData(id));
unAckMessageMap.put(id,"hello the world");



   



### 集成 RabbitMQSpring Cloud 的方法 在 Spring Cloud 中集成 RabbitMQ 是一种常见的需求,用于实现消息队列通信和分布式系统的解耦。以下是关于如何配置、使用以及提供示例代码的详细介绍。 #### 1. 添加依赖项 为了在项目中启用 RabbitMQ 支持,需要引入 `spring-boot-starter-amqp` 和其他必要的依赖项。这些依赖可以通过 Maven 或 Gradle 进行管理: 对于 Maven 用户: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 对于 Gradle 用户: ```gradle implementation 'org.springframework.boot:spring-boot-starter-amqp' ``` 此操作会自动导入所需的 RabbitMQ 客户端库和其他支持组件[^2]。 --- #### 2. 配置 RabbitMQ 参数 通过 `application.properties` 文件可以轻松设置 RabbitMQ 的连接参数。以下是一个典型的配置示例: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 如果使用的是 Docker 环境或其他主机地址,则需调整对应的 `host` 值以匹配实际部署环境[^4]。 --- #### 3. 创建生产者类 创建一个简单的生产者来发送消息到指定的消息队列。下面展示了一个基于注解的方式定义 RabbitTemplate 并向队列推送数据的例子: ```java import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MessageProducer { @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("myQueue", message); System.out.println("Message sent: " + message); } } ``` 在此处,“myQueue”代表目标队列名称,可以根据具体业务逻辑自定义命名规则[^1]。 --- #### 4. 实现消费者功能 同样地,利用监听器模式接收来自特定队列中的消息。这里给出一段基本代码片段作为参考: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { @RabbitListener(queues = "myQueue") public void receiveMessage(String message) { System.out.println("Received message: " + message); } } ``` 当有新消息到达 “myQueue” 时,该方法会被触发并打印接收到的内容至控制台[^3]。 --- #### 5. 测试整体流程 启动应用程序之后,调用 `sendMessage()` 方法即可验证整个链路是否正常工作。例如,在控制器层面上设计接口供外部访问测试用途: ```java @RestController @RequestMapping("/api/messages") public class MessageController { @Autowired private MessageProducer producer; @PostMapping public ResponseEntity<String> send(@RequestBody String content){ producer.sendMessage(content); return ResponseEntity.ok("Message Sent"); } } ``` 以上即完成了从初始化到运行的一个完整周期演示过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值