Maison  >  Article  >  Java  >  Comment Springboot intègre la file d'attente de messages RabbitMQ

Comment Springboot intègre la file d'attente de messages RabbitMQ

WBOY
WBOYavant
2023-05-13 22:55:13799parcourir

    Projet Producteur

    Dépendances POM

    Vous pouvez choisir d'ajouter des dépendances directement lors de la création du projet.

    Comment Springboot intègre la file dattente de messages RabbitMQ

    Comment Springboot intègre la file dattente de messages RabbitMQ

    fichier d'application

    Étant donné que Rabbitmq a une adresse par défaut et des informations utilisateur, il n'est pas nécessaire de le configurer s'il s'agit d'un RabbitMQ local.

    Comment Springboot intègre la file dattente de messages RabbitMQ

    Comment Springboot intègre la file dattente de messages RabbitMQ

    Fichier de configuration RabbitMQ :

    Lors de l'utilisation des commutateurs et des files d'attente associés, nous devons déclarer les commutateurs et les files d'attente. S'il n'y a pas d'informations correspondantes, le projet de démarrage échouera. Par conséquent, lorsque nous utilisons Springboot pour intégrer Rabbitmq, nous pouvons utiliser le fichier de configuration pour déclarer le commutateur et la file d'attente et lier la relation entre les deux. Étant donné que le mode Fanout est actuellement en cours de démonstration, FanoutExchange est utilisé pour déclarer le commutateur, et d'autres modes utilisent les TopicExchange et DirectExchange correspondants pour déclarer.

    @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());
    }
    }
    Code d'entreprise du producteur

    Cette partie du code distribue simplement des messages en appelant 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 :

    L'ingénierie du consommateur est similaire à l'ingénierie du producteur. Nous devons d'abord introduire des dépendances, puis effectuer les configurations pertinentes dans le fichier d'application pour commencer à écrire du code. Dans le projet consommateur, nous pouvons également écrire des fichiers de configuration Rabbitmq pour déclarer les commutateurs et les files d'attente. Il est recommandé d'écrire le fichier de configuration côté consommateur, car le côté consommateur est le premier projet à démarrer. Si le commutateur et la file d'attente ne sont pas créés, le démarrage du projet échouera. Écoute des messages

    Nous écoutons la file d'attente des messages via l'annotation RabbitListener. Il convient de noter que nous devons confier la surveillance à la gestion de Spring via l'annotation des composants, sinon nous ne pouvons pas recevoir normalement les messages du serveur. Une seule surveillance des e-mails est donnée ici. Les files d'attente duanxin et SMS déclarées par le producteur ci-dessus peuvent être créées par lui-même. Il vous suffit de modifier le nom de la file d'attente. @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

    Démarrez d'abord le projet consommateur, puis créez une classe de test dans le projet producteur pour envoyer des messages.

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

    Après l'envoi du message, nous pouvons constater dans la console que le consommateur a accepté le message avec succès.

    Comment Springboot intègre la file dattente de messages RabbitMQ

    Mode direct

    Producteur

    Les étapes pour créer un projet sont les mêmes que ci-dessus.

    Fichier de configuration

    La configuration est fondamentalement la même que ci-dessus Puisque cette partie teste le mode direct, vous devez utiliser DirectExchange pour créer le commutateur. Il convient de noter que le nom de la méthode dans cette classe ne peut pas être le même que le nom de la méthode dans le fichier de configuration Rabbitmq ci-dessus, car nous utilisons des annotations de bean pour le transmettre à Spring Management. Si les noms sont les mêmes, le démarrage du projet le fera. échouer.

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

    Code entreprise

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

    Consommateur

    Écoute des messages

    La même chose que ci-dessus, faites simplement attention au nom de la file d'attente.

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

    Mode sujet

    Les modes ci-dessus déclarent tous la relation entre les commutateurs, les files d'attente et les liaisons via des fichiers de configuration. En fait, nous pouvons également déclarer des commutateurs et des annotations via des annotations.

    Producteur

    Puisqu'il est déclaré à l'aide d'annotations, nous n'avons pas besoin de créer de fichier de configuration et pouvons écrire directement du code métier. Lors des tests, il nous suffit de modifier le nom de l'itinéraire. Pour plus de détails sur la façon de le modifier, veuillez consulter le lien au début de l'article pour voir comment chaque mode est utilisé.

    @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

    Le code est fondamentalement le même que ci-dessus, la différence est que nous lions directement la file d'attente et basculons dans l'annotation RabbitListener. Il convient de noter que des chaînes sont utilisées dans chaque paramètre. La valeur correspond à la file d'attente et les paramètres correspondants sont le nom de la file d'attente, la persistance et la suppression automatique. Pour le switch correspondant à l'échange, les paramètres correspondants sont le nom du switch et le type du switch. La clé correspond au nom de l'itinéraire.

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

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer