1.pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.yml
spring:
application:
name: rabbitmq-server
rabbitmq:
host: localhost
port: 5672
publisher-confirms: true
publisher-returns: true
username: admin
password: admin
virtual-host: /
3.配置
package com.study.config;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue queue(){
return new Queue("queue1", true);
}
@Bean
public ConnectionFactory connectionFactory(RabbitProperties properties){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(properties.getHost());
connectionFactory.setUsername(properties.getUsername());
connectionFactory.setPassword(properties.getPassword());
connectionFactory.setVirtualHost(properties.getVirtualHost());
connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
connectionFactory.setChannelCacheSize(10);
connectionFactory.setPort(properties.getPort());
connectionFactory.setRequestedHeartBeat(60);
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
rabbitTemplate.setMandatory(false);
/**
* 当setMandatory=true时,发布消息找不到对应的routingKey 会回调
*/
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
System.out.println("returnCallback replyCode:"+ replyCode);
System.out.println("returnCallback replyText:"+ replyText);
System.out.println("returnCallback routingKey:"+ routingKey);
});
/**
* 送达mq服务器之后,就会回调
*/
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
System.out.println("confirmCallback ack:" + ack);
System.out.println("confirmCallback cause:"+ cause);
});
return rabbitTemplate;
}
@Bean("simpleRabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);//手动ack
factory.setConcurrentConsumers(5);
factory.setMaxConcurrentConsumers(10);
return factory;
}
@RabbitHandler
@RabbitListener(queues = "queue1", containerFactory = "simpleRabbitListenerContainerFactory" )
public void consumer(Message message, Channel channel) throws IOException {
try {
System.out.println(message.toString());
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
} catch (IOException e) {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), true, false);
}
}
}