Heim >Java >javaLernprogramm >Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

WBOY
WBOYnach vorne
2023-05-13 22:55:13822Durchsuche

    Produzentenprojekt

    POM-Abhängigkeiten

    Sie können Abhängigkeiten direkt beim Erstellen des Projekts hinzufügen.

    Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

    Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

    Anwendungsdatei

    Da Rabbitmq über eine Standardadresse und Benutzerinformationen verfügt, ist keine Konfiguration erforderlich, wenn es sich um lokales Rabbitmq handelt.

    Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

    Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

    RabbitMQ-Konfigurationsdatei:

    Bei Verwendung verwandter Switches und Warteschlangen müssen wir die Switches und Warteschlangen deklarieren, wenn keine entsprechenden Informationen vorhanden sind, schlägt das Startprojekt fehl. Wenn wir also Springboot zur Integration von Rabbitmq verwenden, können wir die Konfigurationsdatei verwenden, um den Switch und die Warteschlange zu deklarieren und die Beziehung zwischen den beiden zu binden. Da der Fanout-Modus derzeit demonstriert wird, wird FanoutExchange zum Deklarieren des Schalters verwendet, während andere Modi zum Deklarieren das entsprechende TopicExchange und DirectExchange verwenden.

    @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-Geschäftscode

    Dieser Teil des Codes verteilt einfach Nachrichten durch den Aufruf von 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:

    Consumer Engineering ähnelt dem Producer Engineering. Wir müssen zunächst Abhängigkeiten einführen und dann relevante Konfigurationen in der Anwendungsdatei vornehmen, um mit dem Schreiben von Code zu beginnen. Im Verbraucherprojekt können wir auch Rabbitmq-Konfigurationsdateien schreiben, um Schalter und Warteschlangen zu deklarieren. Es wird empfohlen, die Konfigurationsdatei auf der Verbraucherseite zu schreiben, da die Verbraucherseite das erste Projekt ist, das gestartet wird. Wenn der Switch und die Warteschlange nicht erstellt werden, schlägt der Projektstart fehl. Abhören von Nachrichten

    Wir hören die Nachrichtenwarteschlange über die RabbitListener-Annotation ab. Es ist zu beachten, dass wir die Überwachung über die Komponentenanmerkung an die Federverwaltung übergeben müssen, da wir sonst keine Nachrichten vom Server normal empfangen können. Hier wird nur eine E-Mail-Nachrichtenüberwachung bereitgestellt. Die vom Hersteller oben deklarierten Duanxin- und SMS-Warteschlangen können selbst erstellt werden. Sie müssen nur den Warteschlangennamen ändern. @Service öffentliche Klasse OrderService {

    @RabbitListener(queues = {"email.fanout.queue"})
    @Component
    public class FanoutEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email fanout -----》接收到" + message);
        }
    }

    Test

    Starten Sie zuerst das Verbraucherprojekt und erstellen Sie dann eine Testklasse im Produzentenprojekt, um Nachrichten zu senden.

    @SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests {
    
    @Autowired
    private OrderService orderService;
    
    @Test
    void contextLoads() {
        orderService.makeOrder();
    }
    }

    Nach dem Senden der Nachricht können wir in der Konsole feststellen, dass der Verbraucher die Nachricht erfolgreich angenommen hat.

    Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert

    Direktmodus

    Produzent

    Die Schritte zum Erstellen eines Projekts sind die gleichen wie oben.

    Konfigurationsdatei

    Die Konfiguration ist grundsätzlich dieselbe wie oben. Da dieser Teil den Direktmodus testet, müssen Sie DirectExchange verwenden, um den Switch zu erstellen. Es ist zu beachten, dass der Methodenname in dieser Klasse nicht mit dem Methodennamen in der obigen Rabbitmq-Konfigurationsdatei identisch sein kann, da wir Bean-Anmerkungen verwenden, um ihn an die Federverwaltung zu übergeben. Wenn die Namen identisch sind, wird das Projekt gestartet scheitern.

    @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");
    }
    }

    Geschäftscode

    @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);
        }
    
    }

    Verbraucher

    Nachrichtenabhören

    Das Gleiche wie oben, achten Sie nur auf den Namen der Warteschlange.

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

    Themenmodus

    Die oben genannten Modi deklarieren alle die Beziehung zwischen Schaltern, Warteschlangen und Bindungen über Konfigurationsdateien. Tatsächlich können wir Schalter und Anmerkungen auch über Anmerkungen deklarieren.

    Produzent

    Da es mithilfe von Anmerkungen deklariert wird, müssen wir keine Konfigurationsdatei erstellen und können Geschäftscode direkt schreiben. Beim Testen müssen wir nur den Routennamen ändern. Für spezifische Anweisungen klicken Sie bitte auf den Link am Anfang des Artikels, um zu sehen, wie die einzelnen Modi verwendet werden.

    @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

    Der Code ist im Grunde der gleiche wie oben, der Unterschied besteht darin, dass wir die Warteschlange direkt binden und die RabbitListener-Annotation einschalten. Es ist zu beachten, dass in jedem Parameter Zeichenfolgen verwendet werden. Der Wert entspricht der Warteschlange und die entsprechenden Parameter sind Warteschlangenname, Persistenz und automatisches Löschen. Für den dem Austausch entsprechenden Switch sind die entsprechenden Parameter der Switch-Name und der Switch-Typ. Der Schlüssel entspricht dem Routennamen.

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "email.topic.queue",durable = "true",autoDelete = "false"),
            exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
            key = "*.email.#"
    ))
    @Component
    public class TopicEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email topic -----》接收到" + message);
        }
    }

    Das obige ist der detaillierte Inhalt vonWie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen