安装RabbitMQ的方式有很多种,其中一种是通过Docker镜像安装,所以我们首先需要安装Docker。查看系统版本:
lsb_release -a
显示为:Alibaba Cloud Linux release 3 (Soaring Falcon)
,这是阿里云基于龙蜥社区(OpenAnolis)的龙蜥操作系统(Anolis OS)打造的操作系统发行版,阿里云的产品文档中给出了针对这一系统的Docker安装步骤:
yum -y install dnf
dnf -y install docker
docker images
该方式安装的podman-docker没有守护进程(systemd),因此您在后续的操作中无需关注podman-docker的运行状态(无需进行systemctl命令的相关操作),直接使用Docker即可。
可以说非常的方便。
使用Docker安装RabbitMQ的方法参考官方文档:
docker pull rabbitmq:management
注意:rabbitmq后面的:management
说明这是带控制台的版本。
docker images
docker run -d --hostname rbt-host --name rbt-dm -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 5672:5672 -p 15672:15672 7ac1b528279a
参数说明:
docker logs rbt-dm
启动容器后稍等一会儿,执行上面的命令,如果顺利的话可以看到:
说明RabbitMQ已经跑起来了。
因为一会儿要编写的Hello World程序运行在本地,而需要访问的RabbitMQ部署在ECS上,所以需要开放ECS的防火墙端口。具体步骤如下:
firewall-cmd --list-port
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload
除了开放系统端口外,还需要调整阿里云ECS的安全组策略,在安全组规则中手动添加如下的规则即可:
提示:控制台所需的15672端口的设置方法同上。
整合Java和RabbitMQ的最简单的方式之一,就是初始化一个Maven项目并引入依赖。可以通过Spring Initializr网站或IDE初始化,这里不再赘述。
从Maven中央仓库获取,这里使用当前最新的5.15.0版本:
<dependency>
<groupId>com.rabbitmqgroupId>
<artifactId>amqp-clientartifactId>
<version>5.15.0version>
dependency>
public class Send {
private static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("somehost");
factory.setPort(5672);
// 因为在启动时指定了用户名和密码,所以这里需要设置以通过权限验证
factory.setUsername("admin");
factory.setPassword("123456");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 这一步是幂等的,只有当指定的queue不存在时才会创建这个queue
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("[x] Send '" + message + "'");
}
}
}
运行后控制台打印出[x] Send 'Hello World!'
。
提示:如果生产者运行失败,一种可能的原因是RabbitMQ运行的空闲磁盘空间不足(默认需要至少200MB),这种情况下RabbitMQ会拒绝接收消息。可以查看日志来确认是不是这个问题,如有必要调整下disk_free_limit参数试试(官方指南)。
public class Recv {
private static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("somehost");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println("[*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println("[x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
});
}
}
运行后控制台打印出[x] Received 'Hello World!'
,消费成功。
最后我们可以登录RabbitMQ自带的控制台查看我们创建的queue和发送的消息:
RabbitMQ tutorial