> Java > java지도 시간 > 본문

Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법

WBOY
풀어 주다: 2023-05-13 22:55:13
앞으로
809명이 탐색했습니다.

    Producer Project

    POM 종속성

    프로젝트를 생성할 때 종속성을 직접 추가하도록 선택할 수 있습니다.

    Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법

    Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법

    응용 파일

    rabbitmq에는 기본 주소와 사용자 정보가 있기 때문에 로컬 Rabbitmq라면 따로 설정할 필요가 없습니다.

    Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법

    Springboot가 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());
    }
    }
    로그인 후 복사
    Producer 비즈니스 코드

    코드의 이 부분은 단순히 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);
        }
    }
    로그인 후 복사

    Test

    먼저 소비자 프로젝트를 시작한 후 생산자 프로젝트에 테스트 클래스를 생성하여 메시지를 보냅니다.

    @SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests {
    
    @Autowired
    private OrderService orderService;
    
    @Test
    void contextLoads() {
        orderService.makeOrder();
    }
    }
    로그인 후 복사

    메시지를 보낸 후 콘솔에서 소비자가 메시지를 성공적으로 수락했음을 확인할 수 있습니다.

    Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법

    다이렉트 모드

    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);
        }
    
    }
    로그인 후 복사

    Consumer

    메시지 모니터링

    위와 동일합니다. 대기열 이름만 주의하세요.

    @RabbitListener(queues = {"email.direct.queue"})
    @Component
    public class DirectEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email direct -----》接收到" + message);
        }
    }
    로그인 후 복사

    Topic 모드

    위 모드는 모두 구성 파일을 통해 스위치, 대기열 및 바인딩 간의 관계를 선언합니다. 실제로 주석을 통해 스위치와 주석을 선언할 수도 있습니다.

    Producer

    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);
    }
    }
    로그인 후 복사

    Consumer

    코드는 기본적으로 위와 동일합니다. 차이점은 큐를 직접 바인딩하고 RabbitListener 주석에서 전환한다는 것입니다. 각 매개변수에는 문자열이 사용된다는 점에 유의해야 합니다. 값은 큐에 해당하며 해당 매개변수는 큐 이름, 지속성 및 자동 삭제입니다. 교환에 해당하는 스위치의 경우 해당 매개변수는 스위치 이름과 스위치 유형입니다. 키는 경로 이름에 해당합니다.

    아아아아

    위 내용은 Springboot가 RabbitMQ 메시지 대기열을 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿