yaml 配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: admin
password: admin
virtual-host: /dev
publisher-confirm-type: correlated
publisher-returns: true
template:
mandatory: true
listener:
simple:
acknowledge-mode: manual
配置类
@Configuration
public class RabbitMQConfig {
@Autowired
private ConfirmCallbackService confirmCallbackService;
@Autowired
private ReturnCallbackService returnCallbackService;
@Autowired
RabbitAdmin rabbitAdmin;
@Bean
TopicExchange exchange() {
return new TopicExchange(RabbitMQConst.EXCHANGE_NAME);
}
@Bean
public Queue queue() {
return new Queue(RabbitMQConst.QUEUE_NAME);
}
@Bean
TopicExchange exchange() {
TopicExchange topicExchange =
new TopicExchange(DELAY_EXCHANGE_NAME, true, false, null);
topicExchange.setDelayed(true);
return topicExchange;
}
@Bean
Binding bindingStrategyHiQueue() {
return BindingBuilder
.bind(queue())
.to(exchange())
.with(RabbitMQConst.ROUTING_KEY_NAME);
}
@Bean
RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate =
new RabbitTemplate(connectionFactory);
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(confirmCallbackService);
rabbitTemplate.setReturnCallback(returnCallbackService);
return rabbitTemplate;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
@Bean
public void createExchangeQueue() {
rabbitAdmin.declareExchange(exchange());
}
}
@Slf4j
@Component
public class ConfirmCallbackService
implements RabbitTemplate.ConfirmCallback {
@Override
public void confirm
(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
log.debug("消息发送成功!");
} else {
log.error("[消息发送异常] correlationData={} , cause={}"
, correlationData, cause);
}
}
}
消息发送者
@Service
public class RabbitMQProducerService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMsg(String exchange, String routingKey, String content) {
rabbitTemplate.convertAndSend(exchange, routingKey, content);
}
public void sendGetVideoScoreMsg(String content,int delay){
rabbitTemplate.setConfirmCallback(confirmCallback);
rabbitTemplate.convertAndSend(
RabbitMQConfig.EXCHANGE_NAME,
RabbitMQConfig.ROUTING_KEY_NAME,
content,
message ->
{
message
.getMessageProperties()
.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
message.getMessageProperties().setDelay(delay * 1000);
return message;
}
);
}
}
消息消费者
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = RabbitMQConfig.QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = RabbitMQConfig.EXCHANGE_NAME,
type = "x-delayed-message"),
key = {RabbitMQConfig.ROUTING_KEY_NAME}
),
concurrency = "10"
)
@Transactional(rollbackFor = Exception.class)
public void updateRecordScore(Message message, Channel channel) throws IOException{
long deliverTag = message.getMessageProperties().getDeliveryTag();
try{
String channelId = new String(message.getBody());
if (!StringUtils.isEmpty(channelId)){
voiceVideoRecordRepository.updateRecordScore
(channelId,scoreRecordService.getAddScoreByChannelId(channelId).get());
}
channel.basicAck(deliverTag,false);
}catch (Exception e){
log.error(" get video score failed " ,e);
channel.basicReject(deliverTag,false);
}
}
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = RabbitMQConst.QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = RabbitMQConst.EXCHANGE_NAME,
type = "topic"),
key = {RabbitMQConst.ROUTING_KEY_NAME}
),
// 多线程去消费
concurrency = "10"
)
@Transactional(rollbackFor = Exception.class)
public void consumeMessage(Message message, Channel channel) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
Person person = JSON.parseObject(new String(message.getBody()), Person.class);
channel.basicAck(deliveryTag, false);
} catch (Exception e) {
log.error(" save room duration failed ", e);
channel.basicReject(deliveryTag, false);
}
}