springboot项目中RabbitMQ的使用
说明:本文是根据我自己项目实际开发中的情况整理的,项目中要从MQ1中消费数据,处理完成后放到MQ2中。
1. pom引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. yml配置
spring:
consumerMq:
host: 127.0.0.1
port: 5672
username: 123
password: 123
virtual-host: 478026c-bd27-4918-bd27-478026c9e7a0
producerMq:
host: 127.0.0.2
port: 5672
username: 123
password: 123
virtual-host: 478026c-bd27-4918-bd27-478026c9e7a0
publisher-confirms: true
publisher-returns: true
3. 创建生产者MQ
package com.demo.config.rabbitConfig;
import lombok.extern.slf4j.Slf4j;
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.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
@Slf4j
public class RabbitConfig {
@Bean(name = "consumerConnection")
@Primary
public ConnectionFactory consumerConnection(
@Value("${spring.consumerMq.host}") String host,
@Value("${spring.consumerMq.port}") int port,
@Value("${spring.consumerMq.username}") String username,
@Value("${spring.consumerMq.password}") String password,
@Value("${spring.consumerMq.virtual-host}") String virtualHost
) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setVirtualHost(virtualHost);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean(name = "consumerFactory")
public SimpleRabbitListenerContainerFactory consumerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, @Qualifier("consumerConnection") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConcurrentConsumers(2);
factory.setMaxConcurrentConsumers(4);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean("producerFactory")
public ConnectionFactory producerFactory(
@Value("${spring.producerMq.host}") String host,
@Value("${spring.producerMq.port}") int port,
@Value("${spring.producerMq.username}") String username,
@Value("${spring.producerMq.password}") String password,
@Value("${spring.producerMq.virtual-host}") String virtualHost,
@Value("${spring.producerMq.publisher-returns}") boolean publisherReturns
) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
connectionFactory.setPublisherReturns(publisherReturns);
return connectionFactory;
}
@Bean("rabbitTemplateProducer")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public RabbitTemplate createRabbitTemplate(@Qualifier("producerFactory") ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMandatory(true);
return template;
}
@Bean("rabbitAdminProducer")
public RabbitAdmin rabbitAdmin(@Qualifier("producerFactory") ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
@Bean
public Queue testQueue() {
return new Queue("test_queue",true);
}
@Bean
public DirectExchange defaultExchange() {
return new DirectExchange("test_exchange");
}
@Bean
public Binding testBinding() {
return BindingBuilder.bind(testQueue()).to(defaultExchange()).with("test_queue");
}
}
4. 使用springboot管理的MQ作为消费者(方法所在类对象要被spring管理,比如使用注解@Component)
@RabbitListener(queues = {"test_queue")
@RabbitHandler
public void process(Channel channel, Message message) {
long tag = 0L;
try {
tag = message.getMessageProperties().getDeliveryTag();
String jsonStr = new String(message.getBody());
} catch (WholeException e) {
log.error("消费出错!error={}", e.getMessage(), e);
} finally {
channel.basicAck(tag, false);
}
}
5. 生产者使用
@Autowired
private AmqpTemplate rabbitTemplateProducer;
public void send(String msgList, String exchange, String queue) {
try {
rabbitTemplateProducer.convertAndSend(exchange, queue, msgList);
} catch (Exception e) {
log.error("消息写入rabbit出错", e);
}
}
6. RabbitAdmin或者队列消息数量
@Autowired
private RabbitAdmin rabbitAdminProducer;
public int getQuueMsgCount(String queue){
AMQP.Queue.DeclareOk declareOk = rabbitAdminProducer.getRabbitTemplate().execute(channel -> channel.queueDeclarePassive(queue));
return declareOk.getMessageCount();
}
以上就是我的主要处理的部分,具体逻辑业务我们都有自己的实现没有太大意义。以上对MQ的使用是基于MQ环境服务都搭建完成的前提下完成的,如果你在使用中有问题,请先确保你的MQ环境服务没有问题。