封装RabbitTemplate,使用自定义消息转换器

前面创建项目我就省了。。。活不多说直接上代码!

核心代码

RabbitMQConfig

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author QiuQiu&LL
 * @version 1.0
 */
@Slf4j
@Configuration
public class RabbitMQConfig {

    @Value("${spring.rabbitmq.host}")
    private String addresses;

    @Value("${spring.rabbitmq.port:5672}")
    private Integer port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;

    public static final String MSG_RETURN_RECEIPT_EXCHANGE_NAME = "ms.message.receipt.exchange";

    public static final String MSG_RETURN_RECEIPT_QUEUE_NAME = "ms.message.receipt.queue";

    /**
     * 消息回执交换机
     *
     * @return
     */
    @Bean("receiptExchange")
    public Exchange createExchange() {
        return ExchangeBuilder.directExchange(MSG_RETURN_RECEIPT_EXCHANGE_NAME).durable(true).build();
    }

    /**
     * 消息回执队列
     *
     * @return
     */
    @Bean("receiptQueue")
    public Queue createQueue() {
        return QueueBuilder.durable(MSG_RETURN_RECEIPT_QUEUE_NAME).build();
    }

    /**
     * 绑定交换机和队列
     *
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding createBinding(@Qualifier("receiptExchange") Exchange exchange,
                                 @Qualifier("receiptQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with(MSG_RETURN_RECEIPT_QUEUE_NAME).noargs();
    }

    /**
     * 自定RabbitTemplate
     */
    @Bean(name = "ReceiptRabbitTemplate")
    public RabbitTemplate rabbitTemplate(@Qualifier("ReceiptConnectionFactory") ConnectionFactory connectionFactory,
                                         @Qualifier("ReceiptMessageConverter") MessageConverter messageConverter) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }

    /**
     * RabbitMQConfig中定义connectionFactory中设置属性
     *
     * @return
     */
    @Bean("ReceiptConnectionFactory")
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
        cachingConnectionFactory.setAddresses(this.addresses);
        cachingConnectionFactory.setUsername(this.username);
        cachingConnectionFactory.setPassword(this.password);
        cachingConnectionFactory.setPort(this.port);
        return cachingConnectionFactory;
    }

    /**
     * 消息转换器
     *
     * @return
     */
    @Bean("ReceiptMessageConverter")
    public MessageConverter receiptMessageConverter() {
        return new ReceiptMessageConverter();
    }
}

ReceiptMessageConverter:这里大家根据自己需要自定义即可

import com.alibaba.fastjson.JSON;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.support.converter.AbstractMessageConverter;
import org.springframework.amqp.support.converter.MessageConversionException;

/**
 * @author QiuQiu&LL
 * @version 1.0
 */
public class ReceiptMessageConverter extends AbstractMessageConverter {
    @Override
    protected Message createMessage(Object object, MessageProperties messageProperties) {
        return new Message(JSON.toJSONBytes(object), messageProperties);
    }

    @Override
    public Object fromMessage(Message message) throws MessageConversionException {
        return JSON.parse(message.getBody());
    }
}

ReceiptMessageService

/**
 * @author QiuQiu&LL
 * @version 1.0
 */
public interface ReceiptMessageService {
    void receiptNotify(Object message);
}

ReceiptMessageServiceImpl

/**
 * @author QiuQiu&LL
 * @version 1.0
 */
@Service
public class ReceiptMessageServiceImpl implements ReceiptMessageService {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public ReceiptMessageServiceImpl(@Qualifier("ReceiptRabbitTemplate") RabbitTemplate rabbitTemplate,
                                     @Qualifier("ReceiptMessageConverter") MessageConverter messageConverter) {
        rabbitTemplate.setMessageConverter(messageConverter);
        this.rabbitTemplate = rabbitTemplate;
    }

    @Override
    public void receiptNotify(Object message) {
        rabbitTemplate.convertAndSend(RabbitMQConfig.MSG_RETURN_RECEIPT_EXCHANGE_NAME,
                RabbitMQConfig.MSG_RETURN_RECEIPT_QUEUE_NAME, message);
    }
}

MessageReturnReceiptListener

/**
 * @author QiuQiu&LL
 * @version 1.0
 * 消息回执监听
 */
@Slf4j
@Component
public class MessageReturnReceiptListener {

    @RabbitListener(queues = RabbitMQConfig.MSG_RETURN_RECEIPT_QUEUE_NAME)
    public void returnReceipt(String message) {
        log.info("回执队列接收到的消息为:{}", message);
    }

}

posted @   我也有梦想呀  阅读(504)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-08-04 SpringBoot整合Redis案例缓存首页数据、缓解数据库压力
点击右上角即可分享
微信分享提示