RabbitMQ 시작하기 (RabbitMQ 설치 + RabbitMQ 설치 과정 중 버전 등 문제 해결 + RabbitMQ 서비스 시작 실패 등 문제 해결 + Java 클라이언트 사용)
1. 서문 - 공식 홈페이지 참조
1.1 공식 웹사이트 주소
1.2 버전 비교에 주의하세요
- Linux 버전에서 지원되는 RabbitMQ 버전을 참고하세요.
- Linux에서 지원하는 Erlang 버전을 참고하세요.
- RabbitMQ에서 지원하는 Erlang 버전을 확인하세요.
- 자세한 버전 대응은 아래 링크
https://www.rabbitmq.com/which-erlang.html 을 참조하세요 .
- 자세한 버전 대응은 아래 링크
2. 다운로드 및 설치
2.1 얼랭 다운로드 및 설치
2.1.1 리눅스 버전 확인
- 내 편은 centos이며 명령은 다음과 같습니다.
cat /etc/centos-release
2.1.2 현재 시스템에서 지원하는 erlang 버전 확인
- 명령은 다음과 같습니다:
uname -a
2.1.3 얼랭 다운로드
- 다운로드 주소:
https://github.com/rabbitmq/erlang-rpm . - Linux 버전과 시스템에서 지원하는 erlang 버전에 따라 다음과 같이 해당 erlang을 다운로드하십시오.
- 그래서 여기서 다운받은 내용은
Erlang 23.3.4.18
다음과 같습니다.
2.1.4 얼랭 설치
- 설치 명령은 다음과 같습니다.
rpm -ivh erlang-23.3.4.18-1.el7.x86_64.rpm
2.1.5 발생한 문제
- 설명: 설치
erlang-23.3.4.18-1.el8.x86_64.rpm
( )el8
로 인해 발생한 문제인데, 설치erlang-23.3.4.18-1.el7.x86_64.rpm
(el7
)에는 문제가 없습니다. 제가 사용하는 Linux 시스템에서는 위 확인 내용대로 지원하므로el7
버전 문제인지는 모르겠습니다! - 다음과 같이:
error: Failed dependencies: libtinfo.so.6()(64bit) is needed by erlang-23.3.4.18-1.el8.x86_64 libz.so.1(ZLIB_1.2.7.1)(64bit) is needed by erlang-23.3.4.18-1.el8.x86_64
- 문제 해결: 또한 이 명령의 기능은
다음과 같습니다 . 더 이상 패키지 간의 종속성을 분석하고 직접 설치하지 않습니다.--nodeps --force
rpm -ivh erlang-23.3.4.18-1.el8.x86_64.rpm --nodeps --force
2.2 socat 설치
- 설치 명령은 다음과 같습니다.
yum install socat -y
2.3 Rabbitmq-server 다운로드 및 설치
2.3.1 Rabbitmq 서버 다운로드
- RabbitMQ를 다운로드할 때 위에서 다운로드한 Erlang 버전( )에 주의한
Erlang 23.3.4.18
후 해당 RabbitMQ 버전을 찾으세요.
다운로드 주소 1: https://github.com/rabbitmq/rabbitmq-server/releases 와 같이 새 버전을 찾기는 쉽지만 이전 버전을 찾기가 어렵습니다 .- 다운로드 주소 2:rpm 창고
https://packagecloud.io/rabbitmq .
- Linux 시스템 및 Erlang 버전에 따라 다음과 같이 해당 Rabbitmq 버전을 찾으십시오.
2.3.2 Rabbitmq 서버 설치
- 설치 명령은 다음과 같습니다.
rpm -ivh rabbitmq-server-3.9.13-1.el7.noarch.rpm
3. 서비스 시작
3.1 서비스 시작
- 설치 후 설치 디렉토리를 찾으십시오.
whereis rabbitmq
- 설치
sbin
디렉터리를 입력하세요:
- 서비스 시작:
./rabbitmq-server start
- 서비스가 시작되었는지 확인하십시오.
ps -ef | grep rabbitmq
3.2 서비스 시작 실패
3.2.1 버전 문제
- 시동이 실패하면 erlang이 설치되어 있는지, erlang 버전이 맞는지 확인하세요.check 명령은 다음과 같습니다.
rpm -qa|grep erlang
- 잘못된 버전이 설치된 경우
erlang
제거하고 다시 설치할 수 있습니다.(rabbitmq는 erlang에 의존하므로 제거하기 전에 Rabbitmq를 제거하십시오.) 제거 명령은 다음과 같습니다.# 1. 卸载rabbitmq-server rpm -e rabbitmq-server rm -rf /usr/lib/rabbitmq # 2. 卸载erlang rpm -e erlang rm -rf /usr/lib64/erlang
- 그런 다음 올바른 버전을 다시 설치하십시오.
4. 관리 인터페이스에 액세스
4.1 그래픽 관리 인터페이스 열기
- Rabbitmq가 시작되면 먼저 서비스를 중지한 후 웹 인터페이스 플러그인을 설치합니다.명령어는 다음과 같습니다.
rabbitmq-plugins enable rabbitmq_management
4.2 점유된 포트 확인
-
다음과 같이:
ps -ef | grep rabbit lsof -i | grep pid
4.3 오픈 포트 15672
- 다음 문서를 참조하십시오:
Linux에서 방화벽 상태 확인, 방화벽 끄기, 포트 열기 및 닫기 등 .
4.4 관리 인터페이스에 액세스
- 주소:
http://服务器IP:15672/
4.5 로그인 문제
4.5.1 문제
- 로그인, 사용자 이름과 비밀번호는 모두 guest입니다. 로그인 후 프롬프트는 다음과 같습니다.
4.5.2 문제 해결 - 새 사용자 생성
- 설치 디렉터리를 입력하고 사용자 및 역할을 봅니다.
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.13/sbin ./rabbitmqctl list_users
- 새 사용자 만들기
- 1단계: mqAdmin 사용자 추가 및 비밀번호 123456 설정
rabbitmqctl add_user mqAdmin 123456
- 2단계: 사용자 역할 설정(mqAdmin 사용자를 관리자 역할로 설정)
rabbitmqctl set_user_tags mqAdmin administrator
- 3단계: 사용자 권한 설정(vhost 및 쓰기/읽기 허용 액세스 지정)
rabbitmqctl set_permissions -p "/" mqAdmin ".*" ".*" ".*"
- 4단계, 다음을 확인하세요.
- 1단계: mqAdmin 사용자 추가 및 비밀번호 123456 설정
4.6 로그인 - 새 사용자 사용
- 위에서 새로 생성된 사용자를 사용하여 다음과 같이
mqAdmin
로그인합니다 .
5. 서비스 및 기타 관련 명령 시작, 중지
5.1 시작 명령
5.1.1 시동 방법
- 방법 1: 위에서 사용된 것입니다. 설치 디렉터리의 sbin 디렉터리를 입력하고 시작합니다.
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.13/sbin/ ./rabbitmq-server start
- 웨이 2:다음과 같이 시작을 설정합니다.
chkconfig rabbitmq-server on
- 방법 3: 서비스 명령 시작(어느 디렉터리에서나 실행 가능)
service rabbitmq-server start
5.1.2 시작 문제——rabbitmq-server.service 작업이 실패했습니다…
5.1.2.1 질문
- 명령을 사용하여 오류 보고 문제를 시작할 때
service rabbitmq-server start
문제 설명은 다음과 같습니다.Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
5.1.2.2 문제 해결
5.1.2.2.1 시도 1:
journalctl -xe
자세한 문제를 보려면 명령을 실행하십시오 .
- 문제를 해결하십시오(/var/log/rabbitmq/ 디렉터리에 있는 두 로그 파일의 그룹 및 소유자를 Rabbitmq로 수정).
cd /var/log/rabbitmq/ chown -R rabbitmq:rabbitmq rabbit@hello_TQ1*
5.1.2.2.2 시도 2:
- 위의 문제를 해결한 후에도 다시 시작한 후에도 오류가 계속 발생하면
journalctl -xe
다음과 같이 명령을 다시 실행하여 자세한 문제를 확인하십시오.
- 해결 방법은 위와 동일합니다. 다음과 같이 오류를 보고하지 않고 명령을 다시
실행합니다 .service rabbitmq-server start
5.2 일반적으로 사용되는 명령 요약
- 서비스 시작
service rabbitmq-server start
- 서비스 중단
service rabbitmq-server stop
- 서비스 다시 시작
service rabbitmq-server restart
6. 빠른 시작
6.1 콘솔에서 메시지 보내기 시뮬레이션
-
스위치를 만들려면 물론 기본 스위치를 사용할 수 있지만 여기서는 수고를 덜기 위해 기본 스위치를 사용하겠습니다.amq.팬아웃。
-
대기열 생성
-
스위치는 다음과 같이 대기열을 바인딩합니다.
-
문자 보내
-
확인하다
6.2 자바 클라이언트 - 기본 코드
6.2.1 치어 파일
- 다음과 같이:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>rabbitmq-demo1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- rabbitmq依赖客户端--> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.8.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> </project>
6.2.2 생산자
- 시험:
- 효과를 확인해보세요
- 첨부코드
package com.liu.susu.example; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * @Description 生产者 * @Author susu */ public class Producer { // 队列名称 public static final String QUEUE_NAME = "queue-hello"; public static void main(String[] args) throws Exception{ //1. 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2. 工厂IP连接rabbitmq的队列 factory.setHost("服务IP地址"); //3. 连接用户名和密码 factory.setUsername("mqAdmin"); factory.setPassword("123456"); //4. 创建连接 Connection connection = factory.newConnection(); //5. 获取信道 Channel channel = connection.createChannel(); /** * 6. 创建一个队列 */ channel.queueDeclare(QUEUE_NAME,false,false,false,null); //7. 定义发送消息的内容 String msg = "hello world!!!,我来之于Java程序"; /** * 8. 发送消息 * 1. 参数1:交换机(发送到哪个交换机上) * 2. 参数2:路由key的值(本次发送用的队列名称) * 3. 参数3:其他参数信息 (本次没有,直接null) * 4. 参数4:发送消息的消息体 */ channel.basicPublish("",QUEUE_NAME,null,msg.getBytes()); System.out.println("=====消息发送成功====="); } }
6.2.3 소비자
-
소비하기 전에 먼저 대기열의 메시지를 읽으세요.
-
소비자 소비 메시지 테스트
-
소비 후 대기열의 메시지를 확인하세요.
-
첨부된 코드:
package com.liu.susu.example; import com.rabbitmq.client.*; /** * @Description 消费者 接收消息 * @Author susu */ public class Consumer { // 队列名称 public static final String QUEUE_NAME = "queue-hello"; public static void main(String[] args) throws Exception{ //1. 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //1.1. 工厂IP连接rabbitmq的队列 factory.setHost("服务IP地址"); //1.2. 连接用户名和密码 factory.setUsername("mqAdmin"); factory.setPassword("123456"); //2. 创建连接 Connection connection = factory.newConnection(); //3. 获取信道 Channel channel = connection.createChannel(); // 接收消息后的回调 DeliverCallback deliverCallback = (consumerTag,msg)->{ byte[] msgBody = msg.getBody(); System.out.println("消费的消息是:" + new String(msgBody)); }; // 取消消息时的回调 CancelCallback cancelCallback = (consumerTag)->{ System.out.println("===消息消费被取消===="); }; /** * 4. 消费者消费消息 * 1. 参数1:消费哪个队列 * 2. 参数2:消费成功之后是否要自定应答 * true——自动应答 * false——手动应答 * 3. 参数3:消费者接收消息后的回调方法 * 4. 参数4:消费者取消消费的回调(正常接收不调用) */ channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback); } }
6.2.4 발생한 문제
6.2.4.1 문제 1——연결 시간 초과
- 문제 설명: 작업 시간 초과(Connection timed out)
- 문제 해결
클라우드 서비스의 경우 보안 그룹의 포트를 열면5672
문제를 해결할 수 있습니다.
6.2.4.2 질문 2——연결이 거부되었습니다.
- 질문은 다음과 같습니다.
Connection refused (Connection refused)
- 문제를 해결하십시오.
방화벽이 닫혀 있지 않으면5672
방화벽의 포트를 엽니다.sudo firewall-cmd --add-port=5672/tcp --permanent firewall-cmd --reload
6.3 자바 클라이언트——Spring AMQP
6.3.1 소개
- AMQP(Advanced Message Queuing Protocol)는 애플리케이션 간에 비즈니스 메시지를 전달하기 위한 개방형 표준입니다. 이 프로토콜은 언어 플랫폼과는 아무런 관련이 없으며 마이크로서비스의 독립성에 대한 요구 사항에 더 부합합니다.
- Spring AMQP는 메시지를 보내고 받기 위한 템플릿을 제공하는 AMQP 프로토콜을 기반으로 하는 API 사양 집합입니다.
- Spring AMQP는
spring-amqp
두spring-rabbit
부분으로 구성됩니다. spring-amqp는 기본 추상화이고 spring-rabbit은 기본 기본 구현입니다. - 공식 웹사이트(
https://spring.io/projects/spring-amqp )를 참고하세요 .
- Spring AMQP는
6.3.2 프로젝트 구조
-
디렉토리 구조
-
parentpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>rabbitmq-demo2</name> <url>http://maven.apache.org</url> <modules> <module>producer</module> <module>consumer</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>3.8.1</junit.version> <lombok.version>1.16.8</lombok.version> <spring-boot.version>2.7.16</spring-boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.7.14</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- <dependency>--> <!-- <groupId>junit</groupId>--> <!-- <artifactId>junit</artifactId>--> <!-- <version>${junit.version}</version>--> <!-- <scope>test</scope>--> <!-- </dependency>--> </dependencies> </dependencyManagement> </project>
6.3.3 생산자 서비스
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>producer</artifactId> <packaging>jar</packaging> <name>producer</name> <description>producer</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build> </project>
-
application.yml
spring: rabbitmq: host: 服务IP地址 # 服务IP port: 5672 # 端口(发送消息的端口5672 rabbitmq管理界面的端口15672) # virtual-host: /mqAdmin # 虚拟主机 username: mqAdmin # 用户名 password: 123456 # 密码
-
메시지 전송을 위한 테스트 클래스
package com.liu.susu.producer; import org.junit.jupiter.api.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * @Description * @Author susu */ @SpringBootTest public class ProducerTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void publishMsg(){ System.out.println("---------------------"); String queueName = "queue-hello"; String msg = "hello,I am from amqp!!!"; //发送消息 rabbitTemplate.convertAndSend(queueName,msg); System.out.println("amqp——消息发送成功!!!"); } }
-
효과를 확인하기 위한 테스트
6.3.4 소비자 서비스
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>consumer</artifactId> <packaging>jar</packaging> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>consumer</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
application.yml
logging: pattern: dateformat: HH:mm:ss:SSSS spring: rabbitmq: host: 服务IP地址 # 服务IP port: 5672 # 端口(发送消息的端口5672 rabbitmq管理界面的端口15672) # virtual-host: /mqAdmin # 虚拟主机 username: mqAdmin # 用户名 password: 123456 # 密码
-
메시지를 받는 구성요소
package com.liu.susu.consumer.listeners; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @Description * @Author susu */ @Component public class MqListener { @RabbitListener(queues = "queue-hello") //监听的队列 public void listenQueues(String msg){ System.out.println("消费者收到消息===>"+msg); } }
-
서비스를 시작하고 테스트하여 효과를 확인하세요.