Spring boot 통합 RabbitMQ 의 예제 코드
RabbitMQ 는 AMQP 를 바탕 으로 완전 하고 재 활용 가능 한 기업 정보 시스템 이다.
MQ 는 모두 Message Queue 라 고 하 는데 메시지 큐(MQ)는 응용 프로그램 이 응용 프로그램 에 대한 통신 방법 이다.응용 프로그램 은 전용 연결 없 이 출입 대기 열 메 시 지 를 읽 고 쓰기(응용 프로그램의 데이터 에 대한)를 통 해 통신 합 니 다.메시지 전달 이란 프로그램 간 에 메시지 에서 데 이 터 를 보 내 통신 하 는 것 을 말 하 며,서 로 를 직접 호출 하여 통신 하 는 것 이 아니 라 원 격 프로 세 스 호출 과 같은 기술 을 직접 호출 하 는 것 을 말한다.줄 을 서 는 것 은 응용 프로그램 이 대기 열 을 통 해 통신 하 는 것 을 말한다.대기 열 사용 은 수신 과 전송 프로그램 이 동시에 실행 되 는 요 구 를 제거 합 니 다.
AMQP 는 하나의 프로 토 콜 로 고급 추상 층 메시지 통신 프로 토 콜 이다.
동기 메시지 통신 의 세계 에는 공개 기준(예 를 들 어 COBAR 의 IIOP 나 SOAP 등)이 많 지만 비동기 메시지 처리 에 서 는 그렇지 않 고 대기업 만 상업 적 실현(예 를 들 어 마이크로소프트 MSMQ,IBM 의 Websphere MQ 등)이 있어 2006 년 6 월 Cisco,Redhat,iMatix 등 이 공동으로 AMQP 의 공개 기준 을 만 들 었 다.즉,AMQP 는 비동기 통신 의 협의 이다.
RabbitMQ 사용 필드
프로젝트 에서 즉시 되 돌아 오지 않 고 시간 이 걸 리 는 조작 을 추출 하여 비동기 처 리 를 했 는데 이런 비동기 처리 방식 은 서버 의 요청 응답 시간 을 크게 절약 하여 시스템 의 스루풋 을 높 였 다.그러나 대부분 은 즉각 적 으로 돌아 갈 필요 가 없 을 뿐만 아니 라 실행 이 성공 하 든 안 하 든 상관없다.즉시 되 돌아 갈 필요 가 있 으 면 사용 할 수 있 습 니 다Dubbo.Spring boot 와 Dubbo 를 통합 하여 볼 수 있 습 니 다Spring boot 통합 Dubbox
RabbitMQ 의존
RabbitMQ 는 단순 한 jar 패키지 가 아 닙 니 다.(Jar 패 키 지 는 RabbitMQ 자체 와 통신 하 는 기본 적 인 기능 만 제공 합 니 다)Dubbo 와 마찬가지 로 RabbitMQ 도 다른 소프트웨어 가 필요 합 니 다.다음은 RabbitMQ 가 실행 하 는 데 필요 한 소프트웨어 입 니 다.
1、Erlang
RabbitMQ 소프트웨어 자체 가 Erlang 을 기반 으로 개발 되 었 기 때문에 RabbitMQ 를 실행 하려 면 먼저 Erlang 을 따라 야 합 니 다.
Erlang 홈 페이지
Erlang 다운로드 주소
RabbitMQ
RabbitMQ 야 말로 메시지 큐 를 실현 하 는 핵심 입 니 다.
RabbitMQ 홈 페이지
RabbitMQ 다운로드
RabbitMQ 설정
설치 완료 후,일부 설정 을 완료 해 야 RabbitMQ 를 사용 할 수 있 습 니 다.cmd 에서 RabbitMQ 의 설치 디 렉 터 리 에 있 는 sbin 디 렉 터 리 를 명령 으로 설정 할 수도 있 고,시작 메뉴 에서 RabbitMQ Command Prompt(sbin dir)를 직접 찾 아 RabbitMQ 의 설치 디 렉 터 리 에 직접 도착 하 는 sbin 을 실행 할 수도 있 습 니 다.편리 하도록 관리 플러그 인 을 사용 하여 명령 을 실행 합 니 다.
rabbitmq-plugins.bat enable rabbitmq_management
즉,이것 은 Windows 아래 에 있 습 니 다.리 눅 스 라면 bat 접미사 가 없 으 면 사용 자 를 추가 합 니 다.외부 네트워크 환경 에 사용자 가 없 는 상황 에서 연결 이 성공 하지 못 하기 때문에 사용자 추가 명령 을 수행 합 니 다.
rabbitmqctl.bat add_user springboot password
springboot 은 사용자 이름 이 고 password 는 비밀번호 입 니 다.그리고 프 리 젠 테 이 션 을 편리 하 게 하기 위해 서 저 희 는 springboot 에 관리자 권한 을 부여 하여 관리 페이지 에 로그 인 할 수 있 습 니 다.
rabbitmqctl.bat set_user_tags springboot administrator
계 정 에 가상 호스트 권한 부여
rabbitmqctl.bat set_permissions -p / springboot .* .* .*
그리고 RabbitMQ 서 비 스 를 시작 하여 RabbitMQ 관리 페이지 에 접근 합 니 다.http://localhost:15672로그 인 페이지 를 볼 수 있 습 니 다.사용 자 를 만 들 지 않 으 면 guest,guest 로 로그 인 할 수 있 습 니 다.사용 자 를 만 들 면 만 든 사용자 로 로그 인 할 수 있 습 니 다.Springboot 프로젝트 만 들 기
spring boot 프로젝트 를 만 드 는 것 은 앞의 글 에서 이미 여러 번 말 했 기 때문에 더 이상 말 하지 않 겠 습 니 다.
RabbitMQ 관련 의존 도 추가
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
맞아요.그냥 설정 을 시 켰 어 요.그런데 이해 가 안 될 수도 있어 요.제 가 모든 설정 을 붙 여 드릴 게 요.
<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>wang.raye.rabbitmq</groupId>
<artifactId>demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Springboot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
다른 작업 을 하지 않 았 기 때문에 현재 프로젝트 는 주로 2 개의 모듈,하나의 Sprig boot,하나의 RabbitMQ 에 의존 하고 있 습 니 다.설정 클래스 추가
package wang.raye.rabbitmq.demo1;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Message;
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.ChannelAwareMessageListener;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq
*
* @author Raye
* @since 2016 10 12 10:57:44
*/
@Configuration
public class RabbitMQConfig {
/** */
public static final String EXCHANGE = "my-mq-exchange";
/** key1*/
public static final String ROUTINGKEY1 = "queue_one_key1";
/** key2*/
public static final String ROUTINGKEY2 = "queue_one_key2";
/**
*
* @return
*/
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("127.0.0.1",5672);
connectionFactory.setUsername("springboot");
connectionFactory.setPassword("password");
connectionFactory.setVirtualHost("/");
connectionFactory.setPublisherConfirms(true); //
return connectionFactory;
}
/**
*
*
FanoutExchange: , routingkey
HeadersExchange : key-value
DirectExchange: routingkey
TopicExchange:
*/
@Bean
public DirectExchange defaultExchange() {
return new DirectExchange(EXCHANGE, true, false);
}
/**
* 1
*
* @return
*/
@Bean
public Queue queue() {
return new Queue("queue_one", true); //
}
/**
* 1
*
* @return
*/
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(defaultExchange()).with(RabbitMQConfig.ROUTINGKEY1);
}
/**
* 2
*
* @return
*/
@Bean
public Queue queue1() {
return new Queue("queue_one1", true); //
}
/**
* 2
*
* @return
*/
@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(defaultExchange()).with(RabbitMQConfig.ROUTINGKEY2);
}
/**
* , 1
*
* @return
*/
@Bean
public SimpleMessageListenerContainer messageContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueues(queue());
container.setExposeListenerChannel(true);
container.setMaxConcurrentConsumers(1);
container.setConcurrentConsumers(1);
container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //
container.setMessageListener(new ChannelAwareMessageListener() {
public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception {
byte[] body = message.getBody();
System.out.println(" : " + new String(body));
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //
}
});
return container;
}
/**
* , 1
*
* @return
*/
@Bean
public SimpleMessageListenerContainer messageContainer2() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueues(queue1());
container.setExposeListenerChannel(true);
container.setMaxConcurrentConsumers(1);
container.setConcurrentConsumers(1);
container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //
container.setMessageListener(new ChannelAwareMessageListener() {
public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception {
byte[] body = message.getBody();
System.out.println("queue1 : " + new String(body));
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //
}
});
return container;
}
}
주의해 야 할 것 은 어떻게 설정 하 는 지 보 여주 기 위해 저 는 2 개의 메시지 대기 열 을 설 치 했 습 니 다.본 종 류 는 링크 설정 을 제외 하고 모두 메시지 소비 자 를 대상 으로 합 니 다.물론 메시지 소비자 와 메시지 생산 자 는 링크 정 보 를 설정 해 야 합 니 다.편 의 를 위해 본 프로젝트 의 정보 소비자 와 생산 자 는 모두 본 프로젝트 에 있 습 니 다.일반 실제 프로젝트 에 서 는 같은 프로젝트 에 있 지 않 습 니 다.주석 이 매우 상세 하기 때문에 나 는 더 이상 말 하지 않 겠 다.소식 을 보내다
메 시 지 를 보 내 는 데 편리 하도록 저 는 컨트롤 러 를 직접 썼 습 니 다.인터페이스 에 접근 하 는 형식 으로 메 시 지 를 보 내 는 방법 을 호출 했 습 니 다.말 을 많이 하지 않 고 코드 를 올 렸 습 니 다.
package wang.raye.rabbitmq.demo1;
import java.util.UUID;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* RabbitMQ Controller
* @author Raye
*
*/
@RestController
public class SendController implements RabbitTemplate.ConfirmCallback{
private RabbitTemplate rabbitTemplate;
/**
* rabbitTemplate, , Spring ( )
* @param rabbitTemplate
*/
public SendController(RabbitTemplate rabbitTemplate){
this.rabbitTemplate = rabbitTemplate;
//
this.rabbitTemplate.setConfirmCallback(this);
}
/**
* 1
* @param msg
* @return
*/
@RequestMapping("send1")
public String send1(String msg){
String uuid = UUID.randomUUID().toString();
CorrelationData correlationId = new CorrelationData(uuid);
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE, RabbitMQConfig.ROUTINGKEY1, msg,
correlationId);
return null;
}
/**
* 2
* @param msg
* @return
*/
@RequestMapping("send2")
public String send2(String msg){
String uuid = UUID.randomUUID().toString();
CorrelationData correlationId = new CorrelationData(uuid);
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE, RabbitMQConfig.ROUTINGKEY2, msg,
correlationId);
return null;
}
/**
* , RabbitTemplate.ConfirmCallback
* , RabbitMQ ,
*/
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println(" id:" + correlationData);
if (ack) {
System.out.println(" ");
} else {
System.out.println(" :" + cause+"
");
}
}
}
주의해 야 할 것 은 메시지 리 셋 은 메시지 가 RabbitMQ 서버 에 성공 적 으로 전송 되 었 다 는 것 입 니 다.그리고 프로젝트 를 시작 하고 접근 합 니 다.http://localhost:8082/send1?msg=aaaa 콘 솔 출력 발견
받다
리 셋 id:CorrelationData[id=37e6e913-835 a-4eca-98d1-807325c5900 f]
소식 성공 소비
물론 리 셋 id 가 다 를 수 있 습 니 다.방문 하면http://localhost:8082/send2?msg=bbbb 는 출력
queue 1 소식:bbbb
리 셋 id:CorrelationData[id=0cec7500-3117-4aa2-9ea5-4790879812d 4]
소식 성공 소비
마지막 으로 몇 마디 하 겠 습 니 다.
본 고 는 주로 0 에서 spring boot 까지 RabbitMQ 를 통합 하 는 방법 을 설명 하기 때문에 RabbitMQ 의 많은 정보 와 용법 에 대해 설명 하지 않 았 습 니 다.RabbitMQ 자체 에 익숙 하지 않 은 것 은 RabbitMQ 에 관 한 다른 글 을 보고 본 고demo를 첨부 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.