프로젝트를 생성할 때 종속성을 직접 추가하도록 선택할 수 있습니다.
rabbitmq에는 기본 주소와 사용자 정보가 있기 때문에 로컬 Rabbitmq라면 따로 설정할 필요가 없습니다.
RabbitMQ 구성 파일:
관련 스위치 및 큐를 사용할 때 해당 스위치 및 큐를 선언해야 합니다. 해당 정보가 없으면 시작 프로젝트가 실패합니다. 따라서 springboot를 사용하여 Rabbitmq를 통합할 때 구성 파일을 사용하여 스위치와 대기열을 선언하고 둘 사이의 관계를 바인딩할 수 있습니다. Fanout 모드는 현재 시연 중이므로 FanoutExchange를 사용하여 스위치를 선언하고, 다른 모드에서는 해당 TopicExchange 및 DirectExchange를 사용하여 선언합니다.
@Configuration public class RabbitMQConfiguration { //声明fanout模式的交换机 @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange("fanout_order_exchange", true, false); } //声明队列 @Bean public Queue smsQueue() { return new Queue("sms.fanout.queue", true); } @Bean public Queue emailQueue() { return new Queue("email.fanout.queue", true); } @Bean public Queue duanxinQueue() { return new Queue("duanxin.fanout.queue", true); } //绑定 @Bean public Binding smsBinding() { return BindingBuilder.bind(smsQueue()).to(fanoutExchange()); } @Bean public Binding emailBinding() { return BindingBuilder.bind(emailQueue()).to(fanoutExchange()); } @Bean public Binding duanxinBinding() { return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange()); } }
코드의 이 부분은 단순히 RabbitTemplate을 호출하여 메시지를 배포합니다. @Service public class OrderService {
@Autowired private RabbitTemplate rabbitTemplate; public void makeOrder() { // 保存订单 String orderId = UUID.randomUUID().toString(); System.out.println("下单成功:" + orderId); // 通过MQ完成消息的分发 // 参数1:交换机 ;参数2:路由key/队列名;参数3:消息内容 String exchangeName = "fanout_order_exchange"; rabbitTemplate.convertAndSend(exchangeName, "", orderId); } }
Consumer:
소비자 엔지니어링은 생산자 엔지니어링과 유사합니다. 먼저 종속성을 도입한 다음 애플리케이션 파일에 관련 구성을 만들어 코드 작성을 시작해야 합니다. 소비자 프로젝트에서는 Rabbitmq 구성 파일을 작성하여 스위치와 대기열을 선언할 수도 있습니다. 컨슈머 측에서 구성 파일을 작성하는 것이 좋습니다. 왜냐하면 컨슈머 측이 가장 먼저 시작하는 프로젝트이기 때문입니다. 스위치와 큐가 생성되지 않으면 프로젝트 시작이 실패합니다. 메시지 수신
RabbitListener 주석을 통해 메시지 대기열을 수신합니다. 컴포넌트 주석을 통해 스프링 관리에 모니터링을 넘겨야 한다는 점에 유의해야 합니다. 그렇지 않으면 서버로부터 메시지를 정상적으로 수신할 수 없습니다. 여기서는 하나의 이메일 메시지 모니터링만 제공됩니다. 위의 생산자가 선언한 duanxin 및 SMS 대기열은 대기열 이름만 수정하면 됩니다. @Service public class OrderService {
@RabbitListener(queues = {"email.fanout.queue"}) @Component public class FanoutEmailService { @RabbitHandler public void receive(String message) { System.out.println("email fanout -----》接收到" + message); } }
먼저 소비자 프로젝트를 시작한 후 생산자 프로젝트에 테스트 클래스를 생성하여 메시지를 보냅니다.
@SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests { @Autowired private OrderService orderService; @Test void contextLoads() { orderService.makeOrder(); } }
메시지를 보낸 후 콘솔에서 소비자가 메시지를 성공적으로 수락했음을 확인할 수 있습니다.
Producer
프로젝트를 생성하는 단계는 위와 동일합니다.
구성 파일
구성은 기본적으로 위와 동일합니다. 이 부분은 직접 모드를 테스트하기 때문에 스위치를 생성하려면 DirectExchange를 사용해야 합니다. 이 클래스의 메소드 이름은 위의 Rabbitmq 구성 파일에 있는 메소드 이름과 동일할 수 없다는 점에 유의해야 합니다. 왜냐하면 이름이 동일하면 프로젝트 시작이 Bean 주석을 사용하여 전달되기 때문입니다. 실패하다.
@Configuration public class DirectRabbitMQConfiguration { //声明direct模式的交换机 @Bean public DirectExchange directExchange() { return new DirectExchange("direct_order_exchange", true, false); } //声明队列 @Bean public Queue smsDirectQueue() { return new Queue("sms.direct.queue", true); } @Bean public Queue emailDirectQueue() { return new Queue("email.direct.queue", true); } @Bean public Queue duanxinDirectQueue() { return new Queue("duanxin.direct.queue", true); } //绑定 @Bean public Binding smsDirectBinding() { return BindingBuilder.bind(smsDirectQueue()).to(directExchange()).with("sms"); } @Bean public Binding emailDirectBinding() { return BindingBuilder.bind(emailDirectQueue()).to(directExchange()).with("email"); } @Bean public Binding duanxinDirectBinding() { return BindingBuilder.bind(duanxinDirectQueue()).to(directExchange()).with("duanxin"); } }
@Service public class OrderService { @Autowired private RabbitTemplate rabbitTemplate; public void makeOrderDirect() { // 保存订单 String orderId = UUID.randomUUID().toString(); System.out.println("下单成功:" + orderId); String exchangeName = "direct_order_exchange"; rabbitTemplate.convertAndSend(exchangeName, "sms", orderId); rabbitTemplate.convertAndSend(exchangeName, "email", orderId); } }
위와 동일합니다. 대기열 이름만 주의하세요.
@RabbitListener(queues = {"email.direct.queue"}) @Component public class DirectEmailService { @RabbitHandler public void receive(String message) { System.out.println("email direct -----》接收到" + message); } }
위 모드는 모두 구성 파일을 통해 스위치, 대기열 및 바인딩 간의 관계를 선언합니다. 실제로 주석을 통해 스위치와 주석을 선언할 수도 있습니다.
Annotation을 이용하여 선언하기 때문에 설정 파일을 생성할 필요 없이 비즈니스 코드를 직접 작성할 수 있습니다. 테스트할 때 경로 이름만 수정하면 됩니다. 수정 방법에 대한 자세한 내용은 기사 시작 부분의 링크로 이동하여 각 모드의 사용 방법을 확인하세요.
@Service public class OrderService { @Autowired private RabbitTemplate rabbitTemplate; public void makeOrderTopic() { // 保存订单 String orderId = UUID.randomUUID().toString(); System.out.println("下单成功:" + orderId); String exchangeName = "topic_order_exchange"; String routingKey = "com.email"; rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId); } }
코드는 기본적으로 위와 동일합니다. 차이점은 큐를 직접 바인딩하고 RabbitListener 주석에서 전환한다는 것입니다. 각 매개변수에는 문자열이 사용된다는 점에 유의해야 합니다. 값은 큐에 해당하며 해당 매개변수는 큐 이름, 지속성 및 자동 삭제입니다. 교환에 해당하는 스위치의 경우 해당 매개변수는 스위치 이름과 스위치 유형입니다. 키는 경로 이름에 해당합니다.
아아아아위 내용은 Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!