spring boot 는 RabbitMQ 를 사용 하여 topic 테 마 를 실현 합 니 다.

7701 단어 springboottopic
전편 에서 우 리 는 메시지 시스템 의 유연 한 설정 을 실현 했다.부채 형(fanout)교환 기 를 사용 하 는 설정 을 대체 하 였 습 니 다.직접 연결(direct)교환 기 를 사용 하고 경로 키 를 기반 으로 선택 적 으로 메 시 지 를 받 을 수 있 는 능력 이 있 습 니 다.
비록 직렬 교환 기 를 사용 하면 우리 의 시스템 을 개선 할 수 있 지만,그것 은 여전히 한계 가 있 기 때문에,다 중 조건 의 경 로 를 실현 할 수 없다.
우리 의 메시지 시스템 에서,우 리 는 루트 키 기반 의 대기 열 을 구독 하고 싶 을 뿐만 아니 라,생산 메시지 기반 의 원본 도 구독 하고 싶 습 니 다.이 개념 들 은 유 닉 스 도구 syslog 에서 나온다.이 로 그 는 엄격 한(info/warn/crit...)과 쉬 운(auth/cron/kern...)경로 방식 을 기반 으로 합 니 다.우리 의 예 는 이것 보다 간단 하 다.
이 예 는 우리 에 게 매우 큰 유연성 을 줄 것 이다.예 를 들 어 우 리 는'cron'의 잘못된 로 그 를 감청 하고 싶 을 뿐만 아니 라'kern'에서 온 모든 로 그 를 감청 하고 싶 을 것 이다.
이 유연성 을 실현 하기 위해 서 는 주제 교환기 에 관 한 내용 을 더 알 아야 한다.
테마 교환기
테마 교환 기 를 사용 할 때 임의로 쓰 는 루트 키 를 사용 할 수 없습니다.루트 키 의 형식 은 점 으로 분 할 된 단어 여야 합 니 다.어떤 단 어 를 써 도 좋 고,일반적으로 의 미 를 나 타 낼 수 있다.예 를 들 어'stock.usd.nyse','nyse.vmw','quick.orage.rabbit'등 이다.다만 글자 크기 는 최대 255 바이트 로 제한 된다.
테마 교환기 로 경로 키 를 정의 하려 면 2 점 을 주의해 야 합 니 다.
  • *별표 는 단 어 를 대표 합 니 다.
  • \#우물 번 호 는 0 개 이상 의 단 어 를 대표 합 니 다.

  • 테마 교환기 에 맞 는 경로 키 정의
    이 예 에서 우 리 는 동물 을 묘사 한 모든 소식 을 보 낼 것 이다.이 메 시 지 는 세 단어,두 점 으로 구 성 된 루트 키 와 함께 전 송 됩 니 다.첫 번 째 단 어 는 표현 속도,두 번 째 설명 색상,세 번 째 설명 종류:"..".
    3 가지 바 인 딩 을 만 들 고 Q1 과 키"*.orange.*"바 인 딩,Q2 와"*.*.rabbit","lazy.\#"바 인 딩 을 만 듭 니 다.
    세 가지 귀속 관계 의 개술 은 다음 과 같다.
  • Q1 은 오렌지색 동물 에 관심 이 있다.(대열 1)
  • Q2 는 토끼 와 느 린 속도 에 관 한 모든 동물 에 관심 이 있다.(대열 2)
  • "quick.range.rabbit"로 설 정 된 경로 키 와 의 메시지 가 Q1,Q2 두 대기 열 에 전 달 됩 니 다."lazy.orange.elephant"그 럴 수도 있어 요."quick.orange.fox"첫 번 째 대기 열 로 갑 니 다."lazy.brown.fox"두 번 째 대기 열 로 갑 니 다."lazy.pink.rabbit"두 번 째 대기 열 로 갑 니 다.제때에 두 번 째 바 인 딩 과 일치 합 니 다."quick.brown.fox"일치 하지 않 아 아무 데 도 갈 수 없어 버 려 집 니 다.
    그럼'오렌지','quick.orange.male.rabbit'같은 건 요?어떤 귀속 에 도 일치 하지 않 아 버 려 집 니 다.
    그렇다면'lazy.orange.male.rabbit'도 네 단어의 경로 키 일 까?lazy.\#와 일치 하기 때문에 두 번 째 대기 열 에 전 달 됩 니 다.
    테마 교환기 의 팁
    테마 교환 기 는 강하 고 다른 교환기 와 비슷 하 게 표현 된다.
  • 한 대기 열 이'\#'바 인 딩 키 와 연결 되 었 을 때 이 대기 열 은 모든 메 시 지 를 받 을 수 있 습 니 다.이것 은 부채 형(fanout)교환기 와 유사 합 니 다.
  • "*"and"\#"을 사용 하지 않 을 때 테마 교환 기 는 직렬 교환기 와 다름없다.
  • 코드 예제
    코드 는 이전의 경로 코드 와 다 를 바 가 없습니다.보 세 요.
    Config.java
    
    package com.zb.rabbitMQtest.t5topics.config;
    
    import org.springframework.amqp.core.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author   
     */
    @Configuration(value = "t5Config")
    public class Config {
    
      /**
       *    :  
       *   :2018/3/5   10:45
       * @apiNote        
       */
      @Bean
      public TopicExchange topicExchange() {
        return new TopicExchange("topic-exchange");
      }
    
      /**
       *    :  
       *   :2018/3/5   10:48
       * @apiNote           
       */
      @Bean
      public Queue autoDeleteQueue0() {
        return new AnonymousQueue();
      }
    
      /**
       *    :  
       *   :2018/3/5   10:48
       * @apiNote           
       */
      @Bean
      public Queue autoDeleteQueue1() {
        return new AnonymousQueue();
      }
    
      /**
       *    :  
       *   :2018/3/5   10:48
       * @param topicExchange      
       * @param autoDeleteQueue0       
       * @apiNote          orange   autoDeleteQueue0          
       * @return Binding
       */
      @Bean
      public Binding binding0a(TopicExchange topicExchange, Queue autoDeleteQueue0) {
        return BindingBuilder.bind(autoDeleteQueue0).to(topicExchange).with("*.orange.*");
      }
    
      /**
       *    :  
       *   :2018/3/5   10:48
       * @param topicExchange      
       * @param autoDeleteQueue1       
       * @apiNote          black   autoDeleteQueue1          
       * @return Binding
       */
      @Bean
      public Binding binding1a(TopicExchange topicExchange, Queue autoDeleteQueue1) {
        return BindingBuilder.bind(autoDeleteQueue1).to(topicExchange).with("*.*.rabbit");
      }
    
      /**
       *    :  
       *   :2018/3/5   10:48
       * @param topicExchange      
       * @param autoDeleteQueue1       
       * @apiNote          green   autoDeleteQueue1          
       * @return Binding
       */
      @Bean
      public Binding binding1b(TopicExchange topicExchange, Queue autoDeleteQueue1) {
        return BindingBuilder.bind(autoDeleteQueue1).to(topicExchange).with("lazy.#");
      }
    }
    
    
    Receiver.java
    
    package com.zb.rabbitMQtest.t5topics.receiver;
    
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @author   
     */
    @Component(value = "t5Receiver")
    public class Receiver {
    
      @RabbitListener(queues = "#{autoDeleteQueue0.name}")
      public void receiver0(String str) {
        System.out.println("receiver0++++++++++:" + str);
        //try {
        //  Thread.sleep(1000);
        //} catch (InterruptedException e) {
        //  e.printStackTrace();
        //}
      }
    
      @RabbitListener(queues = "#{autoDeleteQueue1.name}")
      public void receiver1(String str) {
        System.out.println("receiver1++++++++++:" + str);
        //try {
        //  Thread.sleep(1000);
        //} catch (InterruptedException e) {
        //  e.printStackTrace();
        //}
      }
    }
    
    
    Send.java
    
    package com.zb.rabbitMQtest.t5topics.send;
    
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * @author   
     */
    @Component(value = "t5Send")
    public class Send {
    
      @Autowired
      private TopicExchange topicExchange;
    
      @Autowired
      private RabbitTemplate rabbitTemplate;
    
      private String[] keys = {"quick.orange.rabbit",
          "lazy.orange.elephant", "quick.orange.fox",
          "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"};
    
      public void send() {
        String message = "   ";
        for (int i = 0; i < 5; i++) {
          System.out.println("send++++++++++:".concat(message));
          rabbitTemplate.convertAndSend(topicExchange.getName(), keys[5], message);
        }
      }
    }
    
    
    SendTest.java
    
    package com.zb.rabbitMQtest.t5topics.send;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    /**
     * @author   
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SendTest {
    
      @Autowired
      private Send send;
      @Test
      public void send() throws Exception {
        send.send();
      }
    }
    
    
    테스트 결 과 는 놓 치지 않 겠 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기