Rabbitmq 소개
RabbitMQ는 AMQP를 기반으로 한 완전하고 재사용 가능한 엔터프라이즈 메시징 시스템입니다.
MQ는 메시지 대기열의 전체 이름입니다. 메시지 큐 (MQ)는 응용 프로그램과 응용 프로그램 간의 통신 방법입니다. 애플리케이션은 전용 연결없이 대기열 메시지 (응용 프로그램의 데이터)를 읽고 작성하여 통신합니다. 메시지 전달은 메시지로 데이터를 보내는 프로그램 간의 커뮤니케이션을 말하며, 서로 직접 전화하는 대신 직접 통화는 일반적으로 원격 프로 시저 통화와 같은 기술에 사용됩니다. 대기열은 큐를 통해 통신하는 응용 프로그램을 나타냅니다. 대기열을 사용하면 수신 및 전송 애플리케이션이 동시에 실행 해야하는 요구 사항이 제거됩니다.
AMQP는 프로토콜, 높은 수준의 추상화 계층 메시지 통신 프로토콜입니다.
동기식 메시지 (Cobar IIOP 또는 SOAP 등)의 세계에는 많은 공개 표준이 있지만 비동기 메시지 처리에는 해당되지 않습니다. 대기업만이 일부 상업적 구현 (예 : Microsoft의 MSMQ, IBM의 WebSphere MQ 등)을 가지고 있습니다. 따라서 2006 년 6 월 Cisco, Redhat, Imatix 등은 AMQP에 대한 공공 표준을 공동으로 공식화했습니다. 다시 말해, AMQP는 비동기 통신을위한 프로토콜입니다.
RabbitMQ 사용 시나리오
이 프로젝트에서는 즉시 반품을 필요로하지 않는 시간 소모적 인 작업이 비동기식으로 추출되어 처리됩니다. 이 비동기 처리는 서버의 요청 응답 시간을 크게 절약하여 시스템의 처리량을 향상시킵니다. 그러나 대부분의 사람들은 즉시 돌아올 필요가 없으며 실행이 성공했는지 여부는 중요하지 않습니다. 즉시 반환이 필요한 경우 Dubbo를 사용할 수 있습니다. Spring Boot는 Dubbo와 통합되어 Spring Boot Integration Dubbox를 볼 수 있습니다.
RabbitMQ 의존성
RabbitMQ는 간단한 JAR 패키지가 아닙니다 (JAR 패키지는 RabbitMQ 자체와 함께 일부 기본 커뮤니케이션 기능을 제공합니다). Dubbo와 마찬가지로 Rabbitmq는 다른 소프트웨어를 실행해야합니다. 다음은 RabbitMQ가 실행하는 데 필요한 소프트웨어입니다.
1. Erlang
RabbitMQ 소프트웨어 자체는 Erlang을 기반으로 개발되었으므로 RabbitMQ를 실행하려면 먼저 Erlang을 따라야합니다.
Erlang 공식 웹 사이트
Erlang 다운로드 주소
RabbitMq
RabbitMQ는 메시지 대기열을 구현하는 핵심입니다
RabbitMQ 공식 웹 사이트
RabbitMQ 다운로드
RabbitMQ 구성
설치가 완료되면 RabbitMQ를 사용하기 전에 일부 구성을 완료해야합니다. 명령 구성을 통해 RabbitMQ의 설치 디렉토리에서 CMD를 SBIN 디렉토리로 직접 사용할 수 있거나 시작 메뉴에서 RabbitMQ 명령 프롬프트 (SBIN DIR)를 직접 찾을 수있어 SBIN을 RabbitMQ의 설치 디렉토리로 직접 실행할 수 있습니다. 편의를 위해 먼저 관리 플러그인을 활성화하고 명령을 실행합니다.
Rabbitmq-Plugins.bat 활성화 Rabbitmq_management
맞습니다. 이것은 창문 아래에 있습니다. Linux라면 박쥐 접미사가 없습니다. 그런 다음 외부 네트워크 환경에서 사용자없이 연결이 성공할 수 없으므로 사용자를 추가합니다. ADD 사용자 명령을 실행하십시오
Rabbitmqctl.bat add_user springboot 암호
SpringBoot는 사용자 이름이고 비밀번호는 비밀번호입니다
그런 다음 시연의 편의를 위해 관리자 페이지에 로그인을 용이하게하기 위해 관리자 권한을 SpringBoot에 제공합니다.
Rabbitmqctl.bat set_user_tags springboot 관리자
계정 권한을 부여하십시오
Rabbitmqctl.bat set_permissions -p / springboot.*.*.*
그런 다음 RabbitMQ 서비스를 시작하고 RabbitMQ 관리 페이지 http : // localhost : 15672를 방문하여 로그인 페이지를보십시오. 사용자가 생성되지 않은 경우 게스트 및 게스트를 사용하여 로그인 할 수 있습니다. 사용자가 생성 된 사용자가있는 경우 생성 된 사용자를 사용하여 로그인하십시오. 생성 된 사용자가 생성 된 사용자를 사용하여 로그인하십시오.
SpringBoot 프로젝트를 만듭니다
이전 기사에서 스프링 부트 프로젝트 작성을 이미 여러 번 언급 했으므로 여기에별로 말하지 않을 것입니다.
RabbitMQ 관련 종속성을 추가하십시오
<!-RabbitMq-> <pectionement> <groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-amqp </artifactid> </fectionency>
맞습니다. 약간의 구성이지만 이런 식으로 이해하지 못할 수도 있으므로 모든 구성을 게시하는 것이 좋습니다.
<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/0.0.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> <버전> 0.0.1-napshot> <-snapshot> </packshot> <name> demo1 </name> <url> http://maven.apache.org </url> <properties> <proffect.build.sourceencoding> utf-8 </project.build.sourceencoding> </propert> <perg> <groupid> org.springframework.boot> <Artifactid> Spring-Boot-Starter-Parent </artifactid> <4.0.release </version </version> </parent> <pections> <pectionency> <groupid> junit> <artifactid> junit </artifactid> <version> 3.8.1 </version> <spectency> </elevency> <!-springboot> </springboot> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트-스타터-web </artifactid> </exceentency> <!-rabbitmq-> <prectionency> <groupid> org.springframework.boot </groupid> artifactid> spring-boot-starter-amqp </artifactid> </종속성> </project>
다른 작업이 완료되지 않기 때문에 현재 프로젝트는 주로 두 개의 모듈, 1 개의 스프리트 부츠와 하나의 Rabbitmq에 의존합니다.
구성 클래스를 추가하십시오
Package Wang.raye.rabbitmq.demo1; import org.springframework.amqp.core.acknowledgemode; org.springframework.amqp.core.binding import; org.springframework.amqp.core.binding import; org.springframework.amqp.core.bindingbuilder import; import org.springframework.amqp.core.directexchange; import org.springframework.amqp.core.message; import org.springframework.amqp.core.queue; org.springframework.amqp.rabbit.connection.cachingconnectionfactory; org.springframework.amqp.rabbit.connection.connectionFactory; org.springframework.amqp.rabbit.core.channelawaremessagelistener; org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration;/*** rabbitmq configuration class* @author raye* @since 2016 년 10 월 12 일 10:57:44*/ @configuration public class rabbitmqconfig {/** 메시지 스위치*/public static 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 = 새로운 CachingConnectionFactory ( "127.0.0.1", 5672); ConnectionFactory.setUserName ( "SpringBoot"); ConnectionFactory.setPassword ( "비밀번호"); ConnectionFactory.setVirtualHost ( "/"); ConnectionFactory.setPublisherConFirms (true); // return connectionFactory를 설정해야합니다. } / *** 메시지 스위치 구성* 소비자에 대한 FanOutexChange 구성 : 라우팅 키 헤드러스 렉스 change : 속성 키 값을 추가하여 DirecTexChange를 일치하지 않고 모든 바운드 큐에 메시지를 배포합니다. 참, 거짓); } / ** * 메시지 구성 1 * 소비자를위한 구성 * @return * / @bean public queue queue () {return new queue ( "queue_one", true); // 수량 영구}/*** 스위치와 함께 메시지 대기열 1 바인드 큐 1을 소비자를위한 구성* @return*/@bean public binding binding () {return bindingBuilder.bind (queue ()). to (defaultexchange ()). } / ** * 메시지 구성 큐 2 * 소비자를위한 구성 * @return * / @bean public queue queue1 () {return new queue ( "queue_one1", true); // Quick Persistence}/*** 스위치를 사용하여 메시지 큐 바인드 큐를 바인딩* 소비자를위한 구성* @return*/@bean public binding binding1 () {return bindingBuilder.bind (queue1 ()). to (defaultexchange ()). } / *** 메시지 청취를 수락합니다.이 리스너는 메시지 대기열에서 메시지를 수락합니다. 1* 소비자를위한 구성* @return* / @bean publicegelistenercontainer messagecontainer () {simplemessagelistenercontainer container = new simplemessagelistenercontainer (ConnectionFactory ()); container.setqueues (queue ()); 컨테이너 .SetexposElistenerChannel (true); Container.SetMaxConcurrentConsumers (1); Container.SetConcurrentConsumers (1); 컨테이너 .setackNowledGemode (alknitedGemode.manual); // 확인 모드 설정 수동으로 컨테이너 확인 컨테이너 setMessAgelistener (new ChannelaWaremEsagelistener () {public void onMessage (message message, com.rabbitmq.client.channel 채널) 예외 {byte [] body = message.get.getbody (); System.out.println ( " + new string (new string)); channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); 반환 컨테이너; } / *** 메시지 청취를 수락합니다.이 리스너는 메시지 대기열에서 메시지를 수락합니다.* 소비자를위한 구성* / @Bean publicegelistenerContainer messagecontainer2 () {simplemessagelistenercontainer container = new simplemessagelistenercontainer (ConnectionFactorNercontainer ()); container.setqueues (queue1 ()); 컨테이너 .SetexposElistenerChannel (true); Container.SetMaxConcurrentConsumers (1); Container.SetConcurrentConsumers (1); 컨테이너 .setackNowledGemode (alknitedGemode.manual); // 확인 모드 설정 수동으로 컨테이너 확인 컨테이너 확인 컨테이너 .SetMessElistener (New ChannelAwaremEsagelistener () {public void onMessage (메시지 메시지, com.rabbitmq.client.channel 채널) 예외를 {byte [] body = atmess.getbody (); system.out.println ( "queue1 메시지 수신 ( + new string ( + new string)); channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); 반환 컨테이너; }}구성 방법을 더 잘 보여주기 위해 두 개의 메시지 큐를 구성했습니다. 링크 구성이 구성되는 경우를 제외 하고이 클래스의 나머지 부분은 메시지 소비자를 대상으로합니다. 물론 메시지 소비자와 메시지 제작자 모두 링크 정보를 구성해야합니다. 편의를 위해이 프로젝트의 소비자와 생산자는이 프로젝트에 있습니다. 일반적으로 실제 프로젝트는 동일한 프로젝트에 있지 않습니다. 의견은 매우 상세하기 때문에 많이 말하지 않을 것입니다.
메시지를 보내십시오
메시지 보내기를 용이하게하기 위해 인터페이스에 액세스하여 메시지를 보내는 메소드를 호출하기 위해 컨트롤러를 직접 작성했습니다. 더 이상 고민하지 않고 코드를 추가하십시오
패키지 wang.raye.rabbitmq.demo1; import java.util.uuid; import org.springframework.amqp.rabbit.core.rabbittemplate; org.springframework.amqp.rabbit.support.correlationData; org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller;/** * rabbitmq의 컨트롤러를 메시지 보내기위한 컨트롤러를 테스트 * @author raye */ @restcontrollerpublic class sendcontroller rabbittemplate.confirmcallback {private labbittemplate platpler; /*** RabbitTemplate를 구성하여 메시지를 보냅니다. 생성자이기 때문에 스프링은 주석없이 자동으로 주입됩니다 (새 버전의 기능이어야 함) * @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 sectionenceId = new CorrelationData (UUID); RabbitTemplate.convertandSend (Rabbitmqconfig.exchange, Rabbitmqconfig.routingkey1, msg, sectionenceId); 널 리턴; } / ** * 메시지 큐 큐 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, carrelationId); 널 리턴; } / *** 메시지 콜백, 주로 RabbitTemplate을 구현합니다. ConfirmCallback 인터페이스* 메시지 콜백은 RabbitMQ 서버로 전송 된 성공적인 메시지만을 나타낼 수 있으며, 처리 및 허용되는 성공적인 메시지를 나타낼 수 없음* / public void 확인 (ConserrelationData Cearcha, Boolean ACK, 문자열 원인) {System.Out.Out.OUT.OUT.OUT.DATA); if (ack) {system.out.println ( "메시지 소비 실패 :" + age + "/n resend"); }}}메시지 콜백은 RabbitMQ 서버로 전송되는 성공적인 메시지 만 나타낼 수 있습니다.
그런 다음 프로젝트를 시작하고 http : // localhost : 8082/send1? msg = aaaa를 방문하면 콘솔 출력이
받은 메시지 : AAAA
콜백 ID : CorrelationData [id = 37E6E913-835A-4ECA-98D1-807325C5900F]
뉴스의 성공적인 소비
물론 콜백 ID는 다를 수 있습니다. http : // localhost : 8082/send2? msg = bbbb를 방문하면 출력이 있습니다
queue1 수신 메시지 : bbbb
콜백 ID : CorrelationData [id = 0cec7500-3117-4AA2-9EA5-4790879812D4]
뉴스의 성공적인 소비
끝에 몇 마디
이 기사에서는 주로 RabbitMQ를 0에서 SpringBoot까지 통합하는 방법을 설명하기 때문에 많은 정보와 RabbitMQ 사용에 대한 설명이 없습니다. RabbitMQ 자체에 익숙하지 않은 경우 RabbitMQ에 대한 다른 기사를 확인 하고이 기사의 데모를 첨부 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.