封装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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-08-04 SpringBoot整合Redis案例缓存首页数据、缓解数据库压力