利用Spring AMQP的注解实现RabbitMQ消息发送和监听

最近有个Java项目要引入RabbitMQ,监听另一个非Java项目的消息。

我是Java项目,引入Spring AMQP依赖,利用注解轻松搞定Exchanges、Queues、Routing key的注册绑定,实现消息的监听和发送。

另一个非Java项目因为时间比较赶只实现了消息的监听和发送,Exchanges、Queues、Routing key的注册绑定需要手动进行。

本文介绍下怎么利用Spring AMQP的注解实现RabbitMQ消息发送和监听,以及怎么登录控台手动创建User,Virtual host,绑定Exchanges、Queues、Routing key。

第一部分:利用Spring AMQP的注解实现rabbit消息发送和监听

1.引入pom依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.配置类

@Configuration
@Slf4j
public class RabbitMqConfig {
    @Value("${availableProcessors:4}")
    private Integer availableProcessors;

    @Bean
    public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory, MetricsManager metricsManager){
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        rabbitTemplate.setConnectionFactory(connectionFactory);
        //设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                log.info("ConfirmCallback:     相关数据:{}", correlationData);
                log.info("ConfirmCallback:     确认情况:{}", ack);
                log.info("ConfirmCallback:     原因:{}", cause);
            }
        });

        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback(){
            @Override
            public void returnedMessage(ReturnedMessage returned) {
                log.info("ReturnsCallback:     消息:{}", returned);
            }
        });

        return rabbitTemplate;
    }
    /**
     * rabbitListenerContainerFactory是beanName的默认名称,如果不叫这个名称会多出一个默认的bean,@RabbitListener containerFactory
     * @param connectionFactory
     * @return
     */
    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        //代码手动ack
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        //开启消费者数量
        factory.setConcurrentConsumers(availableProcessors);
        // PrefetchCount 每次接受数据量,默认250
        return factory;
    }

3.发送消息

@Component
@Slf4j
public class GenerateImagesSender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    
    public void convertAndSend(String messageData, String exchange, String routingKey) {
        try {
            rabbitTemplate.convertAndSend(exchange, routingKey, messageData, (Message message) -> {
                message.getMessageProperties().setHeader("x-delay", TimeUnit.SECONDS.toMillis(1));
                return message;
            });
            log.info("发送消息成功 routingKey:{}", routingKey);
        } catch (Exception e) {
            log.error("发送消息失败", e);
        }
    }
}

4.监听消息

@Component
@Slf4j
public class TestReceiver {

    /**
     * 监听xxxx
     *
     * @param tag
     * @param channel
     * @param message
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue("Qqueue"),
            exchange = @Exchange(value = "Exchange", type = "x-delayed-message",
                    arguments = @Argument(name = "x-delayed-type", value = "direct")),
            key = "Routing key")})
    public void generateTextSuccessEvent(@Header(AmqpHeaders.DELIVERY_TAG) long tag, Channel channel, Message message) {
        MDC.put(TRACE_ID_NAME, "MQ" + UuidUtil.nextAsTextWithoutHyphen16());
        String msg = null;
        try {
            msg = new String(message.getBody(), "UTF-8");
            log.info("xxxx完成事件监听......msg:{}", msg);
        } catch (Exception e) {
            log.error("xxxx完成事件监听", e);
        } finally {
            ack(tag, channel, msg);
        }
    }

    private void ack(long tag, Channel channel, String msg) {
        try {
            channel.basicAck(tag, false);
        } catch (Exception e) {
            log.error("【报警】basicAck失败:msg={}", msg, e);
        }
    }
}

第二部分:登录控台手动创建User、Virtual host,绑定Exchanges、Queues、Routing key

1.创建user

2.创建Virtual host

3.user绑定Virtual host

4.创建Exchanges

5.创建Queues

6.Exchanges绑定Queues

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 Spring AMQP 和 Redis 消息队列可以实现分布式系统中的异步通信,提高系统的性能和可靠性。 首先,你需要在 Spring Boot 项目中添加 Spring AMQP 和 Redis 的依赖。在 pom.xml 文件中添加以下依赖: ```xml <dependencies> <!-- Spring AMQP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> ``` 接下来,你需要配置 RabbitMQ 和 Redis 的连接信息。在 application.properties 文件中添加以下配置: ```properties # RabbitMQ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # Redis spring.redis.host=localhost spring.redis.port=6379 ``` 然后,你需要创建一个 RabbitMQ消息队列和一个 Redis 的消息队列。在 Spring Boot 项目中,你可以使用 @Bean 注解来创建这些队列。 ```java @Configuration public class QueueConfiguration { @Bean public Queue rabbitQueue() { return new Queue("rabbit.queue"); } @Bean public RedisQueue redisQueue() { return new RedisQueue("redis.queue"); } } ``` 在上面的代码中,我们创建了一个名为 "rabbit.queue" 的 RabbitMQ 队列和一个名为 "redis.queue" 的 Redis 队列。 接下来,你可以在你的代码中使用 RabbitTemplate 和 RedisTemplate 来发送消息。下面是一个简单的例子: ```java @Service public class MessageService { @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RedisTemplate<String, String> redisTemplate; public void sendMessageToRabbit(String message) { rabbitTemplate.convertAndSend("rabbit.queue", message); } public void sendMessageToRedis(String message) { redisTemplate.convertAndSend("redis.queue", message); } } ``` 在上面的代码中,我们创建了一个 MessageService 类来发送消息。我们使用 rabbitTemplate.convertAndSend 方法来发送消息RabbitMQ 队列,使用 redisTemplate.convertAndSend 方法来发送消息到 Redis 队列。 最后,你需要在你的代码中使用 @RabbitListener 和 @RedisQueueListener 注解来接收消息。下面是一个简单的例子: ```java @Service public class MessageService { @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RedisTemplate<String, String> redisTemplate; @RabbitListener(queues = "rabbit.queue") public void receiveMessageFromRabbit(String message) { System.out.println("Received message from RabbitMQ: " + message); } @RedisQueueListener(queues = "redis.queue") public void receiveMessageFromRedis(String message) { System.out.println("Received message from Redis: " + message); } } ``` 在上面的代码中,我们使用 @RabbitListener 注解监听 RabbitMQ 队列中的消息,使用 @RedisQueueListener 注解监听 Redis 队列中的消息。 总之,使用 Spring AMQP 和 Redis 消息队列可以方便地实现分布式系统中的异步通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大兵11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值