Heim >Java >javaLernprogramm >Wie Springboot die RabbitMQ-Nachrichtenwarteschlange integriert
Sie können Abhängigkeiten direkt beim Erstellen des Projekts hinzufügen.
Da Rabbitmq über eine Standardadresse und Benutzerinformationen verfügt, ist keine Konfiguration erforderlich, wenn es sich um lokales Rabbitmq handelt.
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()); } }
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); } }
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.
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"); } }
@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); } }
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); } }
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.
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); } }
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!