spring boot 는 RabbitMQ 를 사용 하여 topic 테 마 를 실현 합 니 다.
비록 직렬 교환 기 를 사용 하면 우리 의 시스템 을 개선 할 수 있 지만,그것 은 여전히 한계 가 있 기 때문에,다 중 조건 의 경 로 를 실현 할 수 없다.
우리 의 메시지 시스템 에서,우 리 는 루트 키 기반 의 대기 열 을 구독 하고 싶 을 뿐만 아니 라,생산 메시지 기반 의 원본 도 구독 하고 싶 습 니 다.이 개념 들 은 유 닉 스 도구 syslog 에서 나온다.이 로 그 는 엄격 한(info/warn/crit...)과 쉬 운(auth/cron/kern...)경로 방식 을 기반 으로 합 니 다.우리 의 예 는 이것 보다 간단 하 다.
이 예 는 우리 에 게 매우 큰 유연성 을 줄 것 이다.예 를 들 어 우 리 는'cron'의 잘못된 로 그 를 감청 하고 싶 을 뿐만 아니 라'kern'에서 온 모든 로 그 를 감청 하고 싶 을 것 이다.
이 유연성 을 실현 하기 위해 서 는 주제 교환기 에 관 한 내용 을 더 알 아야 한다.
테마 교환기
테마 교환 기 를 사용 할 때 임의로 쓰 는 루트 키 를 사용 할 수 없습니다.루트 키 의 형식 은 점 으로 분 할 된 단어 여야 합 니 다.어떤 단 어 를 써 도 좋 고,일반적으로 의 미 를 나 타 낼 수 있다.예 를 들 어'stock.usd.nyse','nyse.vmw','quick.orage.rabbit'등 이다.다만 글자 크기 는 최대 255 바이트 로 제한 된다.
테마 교환기 로 경로 키 를 정의 하려 면 2 점 을 주의해 야 합 니 다.
테마 교환기 에 맞 는 경로 키 정의
이 예 에서 우 리 는 동물 을 묘사 한 모든 소식 을 보 낼 것 이다.이 메 시 지 는 세 단어,두 점 으로 구 성 된 루트 키 와 함께 전 송 됩 니 다.첫 번 째 단 어 는 표현 속도,두 번 째 설명 색상,세 번 째 설명 종류:"
3 가지 바 인 딩 을 만 들 고 Q1 과 키"*.orange.*"바 인 딩,Q2 와"*.*.rabbit","lazy.\#"바 인 딩 을 만 듭 니 다.
세 가지 귀속 관계 의 개술 은 다음 과 같다.
그럼'오렌지','quick.orange.male.rabbit'같은 건 요?어떤 귀속 에 도 일치 하지 않 아 버 려 집 니 다.
그렇다면'lazy.orange.male.rabbit'도 네 단어의 경로 키 일 까?lazy.\#와 일치 하기 때문에 두 번 째 대기 열 에 전 달 됩 니 다.
테마 교환기 의 팁
테마 교환 기 는 강하 고 다른 교환기 와 비슷 하 게 표현 된다.
코드 는 이전의 경로 코드 와 다 를 바 가 없습니다.보 세 요.
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();
}
}
테스트 결 과 는 놓 치지 않 겠 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.