📑前言
本文主要是【Rabbitmq】——解决Rabbitmq相关bug的文章,如果有什么需要改进的地方还请大佬指出⛺️
🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:CSDN主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见
目录
在处理统一身份认证平台推送的RabbitMQ消息时,监听器代码如下:
package com.rabbitmqemail.listener;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@RabbitListener(queues = "mail") //指定一下消息队列,该消息队列是mail消息队列
public class MailQueueListener{
@Autowired
JavaMailSender sender;
@Value("${spring.mail.username}")
String username;
@RabbitHandler
public void sendMailMessage(Map<String,Object> data){
// System.out.println(data.get("email")+" "+data.get("code"));
String email = (String) data.get("email");
Integer code = (Integer) data.get("code");
SimpleMailMessage message= createMessage("欢迎注册我们的网站","您的验证码为"+code+",有效时间三分钟,为了保障您的安全,请勿向他人泄露验证码信息。",email);
System.out.println("message1:"+message.getText());
if (message == null) return;
sender.send(message);
}
private SimpleMailMessage createMessage(String title,String content,String email){
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject(title); //主题
message.setText(content); //内容
message.setTo(email); //发送目标邮箱
message.setFrom(username); //源发送邮箱
return message;
}
}
Rabbitmq配置类信息如下:
package com.rabbitmqemail.config;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfiguration {
//给Bean队列取名为邮件队列
@Bean("emailQueue")
public Queue emailQueue(){
return QueueBuilder
.durable("mail") //给邮件队列取名为email
.build();
}
}
发现报错信息如下:
Adapter.java:258) ~[spring-rabbit-3.0.10.jar:3.0.10]
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:148) ~[spring-rabbit-3.0.10.jar:3.0.10]
... 15 common frames omitted
2023-11-26T18:15:15.480+08:00 WARN 3388 --- [ntContainer#0-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:158) ~[spring-rabbit-3.0.10.jar:3.0.10]
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:148) ~[spring-rabbit-3.0.10.jar:3.0.10]
... 15 common frames omitted
解决方案:将发送的信息转换为JSON格式,在RabbitConfiguration添加JSON格式转换器
package com.rabbitmqemail.config;
@Configuration
public class RabbitConfiguration {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter converter) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(converter);
return template;
}
//给Bean队列取名为邮件队列
@Bean("emailQueue")
public Queue emailQueue(){
return QueueBuilder
.durable("mail") //给邮件队列取名为email
.build();
}
}