手动确认rabbitmq

配置文件

java 复制代码
package com.ynart.config;


import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {

    private static final String PRODUCT_EXCHANGE = "productExchange";

    @Bean
    public TopicExchange productExchange() {
        return new TopicExchange(PRODUCT_EXCHANGE);
    }

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

    @Bean
    public Binding sportsBinding(Queue sportsQueue, TopicExchange productExchange) {
        return BindingBuilder.bind(sportsQueue).to(productExchange).with("sports.*");
    }

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

    @Bean
    public Binding electronicsBinding(Queue electronicsQueue, TopicExchange productExchange) {
        return BindingBuilder.bind(electronicsQueue).to(productExchange).with("electronics.*");
    }

    /**
     * 创建消息监听容器
     * @param connectionFactory
     * @return
     */
    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 设置消息确认模式为手动确认
        return factory;
    }
}

使用

java 复制代码
package com.ynart.rabbitmq;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.rabbitmq.client.Channel;
import com.ynart.Dto.ArtDataEntity;
import com.ynart.exedata.domain.ArtData;
import com.ynart.exedata.service.IArtDataService;
import com.ynart.utils.AesUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

@Component
public class RabbitmqService {

    private final RabbitTemplate rabbitTemplate;
    @Autowired
    private IArtDataService artDataService;
    @Autowired
    private AesUtils aesUtils;

    @Autowired
    public RabbitmqService(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendSportsOrder(String message) {
        rabbitTemplate.convertAndSend("productExchange", "sports.new", message);
    }

    public void sendElectronicsOrder(String message) {
        rabbitTemplate.convertAndSend("productExchange", "electronics.new", message);
    }

    @RabbitListener(queues = "sportsQueue")
    public void receiveSportsOrder(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
        try {

            //TODO 数据梳理入库
            message = aesUtils.decryptAES(message);
            ObjectMapper objectMapper = new ObjectMapper();
            List<ArtDataEntity> list = objectMapper.readValue(message, new TypeReference<List<ArtDataEntity>>() {
            });
            String pattern = "yyyy-MM-dd HH:mm:ss";

            SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
            //mq数据入库
            for (ArtDataEntity artDataEntity : list) {
                ArtData artData = new ArtData();
                artData.setId(null);
                artData.setJsonContent(artDataEntity.getJson_content());
                artData.setUrl(artDataEntity.getUrl());
                artData.setDataVersion(artDataEntity.getData_version());
                artData.setSign(artDataEntity.getSign());
                artData.setStatus(artDataEntity.getStatus().toString());
                artData.setCreatedBy(artDataEntity.getCreated_by());
                artData.setCreatedTime(dateFormat.parse(artDataEntity.getCreated_time()));
                artData.setUpdatedBy(artDataEntity.getUpdated_by());
                artData.setUpdatedTime(dateFormat.parse(artDataEntity.getUpdated_time()));
                artDataService.insertArtData(artData);

            }
            // 手动确认消息
            channel.basicAck(deliveryTag, false);

            //TODO 逻辑修改,不进行回调
//            sendElectronicsOrder(list.get(0).getCreated_by() + ":-art-:" + stringBuilder.toString());

        } catch (Exception e) {
            // 消费消息失败,不进行确认,消息重新回到队列中进行重试
            System.out.println("Failed to process sports order: " + message);
            //TODO 逻辑修改,不进行回调
            channel.basicNack(deliveryTag, false, true);
        }
    }

//    @RabbitListener(queues = "electronicsQueue")
//    public void receiveElectronicsOrder(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
//        try {
//            // 消费消息的业务逻辑
//            System.out.println("Received electronics order: " + message);
//
//            // 手动确认消息
//            channel.basicAck(deliveryTag, false);
//        } catch (Exception e) {
//            // 消费消息失败,不进行确认,消息重新回到队列中进行重试
//            System.out.println("Failed to process electronics order: " + message);
//            channel.basicNack(deliveryTag, false, true);
//        }
//    }
}
相关推荐
凤山老林27 分钟前
Spring Boot 集成 iText 7 实现动态 PDF 生成与电子签章:合同、报表场景实战
spring boot·后端·pdf·itext7·电子签章
卓怡学长42 分钟前
w204基于springbo旅行社签证代理服务系统
java·spring boot·spring·intellij-idea
qwfy1 小时前
我要用 AI-native 架构,从零重建一套制造业 ERP/MES
vue.js·spring boot·架构
vipxieliang1 小时前
ValidX 在微服务架构中的验证策略
java·spring boot
❀͜͡傀儡师1 小时前
20 年沉淀,CAS 8.0 重新定义企业级 SSO:适配 JDK 25 与 Spring Boot 4.1
java·开发语言·spring boot
牧瀬クリスだ1 小时前
Spring统一功能处理
java·spring boot·spring·状态模式
Dreams_l3 小时前
基于SpringBoot实现的抽奖系统(一)
java·spring boot·后端
余槐i3 小时前
rollbackFor 不设置,Checked 异常不回滚:Spring 默认规则与两行修复的取舍
java·spring boot·后端·spring·事务管理
EatFan4 小时前
JunoYi 框架实践:Spring Boot 项目为什么拆成 framework、module、server 三层?
java·spring boot·后端·framework·module·模块化·junoyi
谢亮_vipxieliang5 小时前
ValidX 在微服务架构中的验证策略
java·spring boot·spring·spring cloud·hibernate