一、开源版RabbitMQ
1.依赖:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.5.0</version> <!-- 支持开源所有版本 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.yml配置:
spring: rabbitmq: host: 127.0.0.1 port: 5672 listener: simple: # 开启能者多劳模式 prefetch: 1 # 开启手动ACK acknowledge-mode: manual
3.消费者:监听名为:person_queue 的队列
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class PersonQueueConsumer {
@RabbitListener(queues = "person_queue")
public void process(String msg, Channel channel, Message message) throws InterruptedException, IOException {
// 从MQ获取消息
channel.basicQos(1);
// 执行业务
System.out.println("person_queue 监听的数据为 : " + msg + "开始业务处理…………");
Thread.sleep(3000);
// 确认ACK
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
}
以上,便可实现能者多劳模式。
二、阿里云RabbitMQ
1.依赖:
<dependency> <groupId>com.alibaba.mq-amqp</groupId> <artifactId>mq-amqp-client</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.yml配置:
spring: rabbitmq: host: xxxx port: xxxx username: xxxx password: xxxx virtual-host: xxxx
3.RabbitMQ配置类:
import org.springframework.amqp.core.AcknowledgeMode;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@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.virtual-host}")
private String virtualHost;
@Bean
public ConnectionFactory connectionFactory() {
// 初始化RabbitMQ连接配置connectionFactory。
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
// VirtualHost可以在RabbitMQ控制台手动创建,也可以在这里自动创建。
connectionFactory.setVirtualHost(virtualHost);
// 请务必开启Connection自动重连功能,保证服务端发布时客户端可自动重新连接上服务端。
connectionFactory.getRabbitConnectionFactory().setAutomaticRecoveryEnabled(true);
// 缓存模式推荐设置为CONNECTION。
connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CONNECTION);
// CONNECTION模式下,最大可缓存的connection数量。
connectionFactory.setConnectionCacheSize(10);
// CONNECTION模式下,最大可缓存的Channel数量。
connectionFactory.setChannelCacheSize(64);
return connectionFactory;
}
@Bean
public SimpleRabbitListenerContainerFactory simpleRoutingConnectionFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// 手动ACK
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
// RabbitMQ消息模板,该模板封装了多种常用的消息操作。
return new RabbitTemplate(connectionFactory);
}
}
4.消费者:绑定配置类的:simpleRoutingConnectionFactory,监听名为:artificial_queue的队列
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* @author djh
* @since 2023-08-08
*/
@Component
@Slf4j
public class Test {
@RabbitListener(containerFactory = "simpleRoutingConnectionFactory", queues = "artificial_queue")
public void receiveFromMyQueue(Message message, Channel channel) {
try {
channel.basicQos(1);
} catch (IOException e) {
log.error("ArtificialConsumer从mq获取消息失败:" + e);
}
// 获取消息
byte[] body = message.getBody();
String msg = new String(body, StandardCharsets.UTF_8);
// 业务代码
try {
// 手动ACK
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
log.error("ArtificialConsumer提交消息失败:" + e);
}
}
}
以上,便可实现能者多劳模式。