消息队列是一种用于在应用程序之间传递消息的通信机制。它通常用于解耦生产者和消费者之间的关系,使得它们可以异步地交换数据,从而提高系统的可伸缩性、可靠性和性能。常见的消息队列系统包括 RabbitMQ、Apache Kafka、Amazon SQS(Simple Queue Service)等。
安装消息队列
下载地址: https://www.rabbitmq.com/download.html
1、安装Erlang环境
sudo apt install erlang
2、接着安装RabbitMQ
sudo apt install rabbitmq-server
3、查看RabbitMQ的运行状态
sudo rabbitmqctl status
4、安装RabbitMQ的管理面板开启
sudo rabbitmq-plugins enable rabbitmq_management
5、访问管理页面
地址:127.0.0.1:15672
默认用户名和密码都是guest ,但只限本地访问
6、登录服务器管理面板需要创建一个用户
sudo rabbitmqctl add_user 用户名 密码
7、将管理员权限给予创建的用户
sudo rabbitmqctl set_user_tags admin administrator
8、使用创建好的用户再次登录
使用Java操作消息队列
1、导入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.2</version>
</dependency>
2、实现生产者将信息发送到消息队列
public static void main(String[] args) {
//创建连接
ConnectionFactory factory = new ConnectionFactory();
//设定连接信息
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/test");
//创建连接
try(Connection connection = factory.newConnection()){
}catch (Exception e){
e.printStackTrace();
}
}
在程序中定义并创建消息队列
try(Connection connection = factory.newConnection();
Channel channel = connection.createChannel()){ //创建新的Channel
//声明队列,如果队列不存在会自动创建
channel.queueDeclare("abc", false, false, false, null);
//将队列绑定到交换机
channel.queueBind("abc", "amq.direct", "test-abc");
//发布新的消息,注意消息需要转换为byte[]
channel.basicPublish("amq.direct", "test-abc", null, "Hello World!".getBytes());
}catch (Exception e){
e.printStackTrace();
}
3、实现消费者读取消息队列中的信息
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/test");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//创建一个基本的消费者
channel.basicConsume("abc", false, (s, delivery) -> {
System.out.println(new String(delivery.getBody()));
//basicAck是确认应答
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
//拒绝应答
//channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);
//channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
}, s -> {});
}