依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置yml
消息发送
spring:
# rabbitmq配置
rabbitmq:
# 用户名
username: 账号
# 密码
password: 密码
# 服务器地址
host: ip
# 端口
port: 断开
# 消息失败回调
publisher-returns: true
# 消息确认回调
publisher-confirm-type: correlated
消息接收
#rabbitmq配置
rabbitmq:
# 用户名
username: shop
# 密码
password: shop
# 服务器地址
host: 192.168.85.131
# 端口
port: 5672
listener:
simple:
# 手动确认
acknowledge-mode: manual
配置config
package com.yc.server.config;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.yc.server.pojo.MailConstants;
import com.yc.server.pojo.MailLog;
import com.yc.server.service.IMailLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
public static final Logger Logger = LoggerFactory.getLogger(RabbitMqConfig.class);
@Autowired
private CachingConnectionFactory cachingConnectionFactory;
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setConfirmCallback((data, ack, cause) -> {
String msgId = data.getId();
if (ack) {
Logger.info("{}====>消息发送成功", msgId);
{
}
} else {
Logger.info("{}====>消息发送失败", msgId);
}
});
rabbitTemplate.setReturnCallback((msg, repCode, reText, exchange, routingKey) -> {
Logger.info("{}======>消息发送到queue时失败", msg.getBody());
});
return rabbitTemplate;
}
@Bean
public Queue queue() {
return new Queue(MailConstants.MAIL_QUEUE_NAME, true);
}
@Bean
public DirectExchange directExchange() {
return new DirectExchange(MailConstants.MAIl_EXCHANGE_NAEM);
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(directExchange()).with(MailConstants.MAIL_ROUTING_KEY_NAME);
}
}
package com.yc.server.pojo;
public class MailConstants {
public static final Integer DELIVERING = 0;
public static final Integer SUCCESS = 1;
public static final Integer FAILURE = 2;
public static final Integer MAC_TRY_COUNT = 3;
public static final Integer MSG_TIMEOUT = 1;
public static final String MAIL_QUEUE_NAME = "mail.queue";
public static final String MAIl_EXCHANGE_NAEM = "mail_exchange";
public static final String MAIL_ROUTING_KEY_NAME = "mail.routing.key";
}
发送消息
class mq{
@Autowired
private RabbitTemplate rabbitTemplate;
public void test(){
消息接收
class mq{
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = MailConstants.MAIL_QUEUE_NAME)
public void test(Message message, Channel channel){
T t = message.getPayload();
MessageHeaders headers = message.getHeaders();
long tag = (long) headers.get(AmqpHeaders.DELIVERY_TAG);
String msgId = (String) headers.get("key");
HashOperations hashOperations = redisTemplate.opsForHash();
try {
if (hashOperations.entries("key").containsKey(msgId)) {
logger.info("消息已经被消费======>{}",msgId);
channel.basicAck(tag,false);
}
{业务代码块}
channel.basicAck(tag,false);
} catch (Exception e) {
try {
channel.basicNack(tag,false,true);
} catch (Exception ex) {
e.printStackTrace();
logger.error("消息确认失败======>{}", ex.getMessage());
}
e.printStackTrace();
logger.error("邮件发送失败======>{}", e.getMessage());
}
}
}