SpringBoot简单集成RabbitMQ
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
2.添加配置文件 application.yml
spring.rabbitmq.host: (rabbitmq的主机ip)
spring.rabbitmq.port: 5672(默认是5672)
spring.rabbitmq.username: (账号)
spring.rabbitmq.password: (密码)
spring.rabbitmq.publisher-confirms: true
spring.rabbitmq.publisher-returns: true
spring.rabbitmq.listener.simple.acknowledge-mod: manual
3.编写配置类
@Configuration
public class RabbitConfig {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.publisher-confirms}")
private boolean isConfirm;
public static final String EXCHANGE_A = "my-mq-exchange_A";
public static final String EXCHANGE_B = "my-mq-exchange_B";
public static final String QUEUE_A = "QUEUE_A";
public static final String QUEUE_B = "QUEUE_B";
public static final String ROUTINGKEY_A = "spring-boot-routingKey_A";
public static final String ROUTINGKEY_B = "spring-boot-routingKey_B";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost("/");
connectionFactory.setPublisherConfirms(isConfirm);
return connectionFactory;
}
@Bean(name="tt")
public RabbitListenerContainerFactory<SimpleMessageListenerContainer> tt(){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConcurrentConsumers(5);
factory.setMaxConcurrentConsumers(10);
factory.setReceiveTimeout(10000L);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setConnectionFactory(connectionFactory());
return factory;
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
return template;
}
@Bean
public Queue queueA() {
return new Queue(QUEUE_A, true);
}
@Bean
public Queue queueB() {
return new Queue(QUEUE_B, true);
}
@Bean
public DirectExchange defaultExchange() {
return new DirectExchange(EXCHANGE_A);
}
@Bean
public DirectExchange defaultExchangeB() {
return new DirectExchange(EXCHANGE_B);
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);
}
@Bean
public Binding bindingB() {
return BindingBuilder.bind(queueB()).to(defaultExchangeB()).with(RabbitConfig.ROUTINGKEY_B);
}
}
4.编写生产者
@Component
public class MsgProducer implements RabbitTemplate.ConfirmCallback{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private RabbitTemplate rabbitTemplate;
@Autowired
public MsgProducer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
rabbitTemplate.setConfirmCallback(this);
}
public void sendMsg(String content) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
this.rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_A, RabbitConfig.ROUTINGKEY_A, content, correlationId);
}
public void sendMsgB(String content) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
this.rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_B, RabbitConfig.ROUTINGKEY_B, content, correlationId);
}
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
logger.info(" 回调id:" + correlationData);
if (ack) {
logger.info("消息发送成功");
} else {
logger.info("消息发送失败:" + cause);
}
}
}
5.编写消费者
@Component
public class MsgReceiver {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RabbitListener(containerFactory = "tt",queues = RabbitConfig.QUEUE_A)
@RabbitHandler
public void process(String content,Channel channel, Message message)throws IOException{
logger.info("处理器接收处理队列A当中的消息: " + content);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
@RabbitListener(containerFactory = "tt",queues = RabbitConfig.QUEUE_B)
@RabbitHandler
public void process2(String content,Channel channel, Message message)throws IOException{
logger.info("处理器接收处理队列B当中的消息: " + content);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}
6.简单测试
@Controller
@SpringBootApplication
public class KspServiceRabbitMQApplication {
public static void main(String[] args) {
SpringApplication.run(KspServiceRabbitMQApplication.class, args);
}
@Autowired
private MsgProducer msgProducer;
@ResponseBody
@RequestMapping("test")
public String test(){
msgProducer.sendMsg("信息aaaaaaa");
return "success";
}
@ResponseBody
@RequestMapping("test2")
public String test2(){
msgProducer.sendMsgB("信息bbbbbbbbbb");
return "success";
}
}