Spring boot 통합 RabbitMQ 의 예제 코드

14100 단어 SpringbootRabbitMQ
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를 첨부 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기