【Spring】SpringBoot+RabbitMQ(direct/fanout/topic)の構築方法

发布时间 2023-11-30 17:03:29作者: 农民工024

 

■POM.xmlの中で、下記の内容を追加

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
pom.xml

■application.ymlの中で、下記の内容を追加

spring:
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    cache: false
application.yml

■Send画面とReceive画面を/static/pulicに追加

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Self Send Message Page</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
  <h1>Self Send Message Page</h1>
  <form id="sendForm">
        <label for="inputmessage">Send Message:</label>
        <input type="text" name="message" id="inputmessage">
        <button type="button" id="direct_msg">Send Direct Message</button>
        <button type="button" id="fanout_msg">Send Fanout Message</button>
        <button type="button" id="topic_msg">Send Topic Message</button>
  </form>
  <script>
    $(document).ready(function () {
        $("#direct_msg").click(function () {
            var msg = $("#inputmessage").val();
            $.post("/srr/self/sendDirectMsg",{message:msg},function (){
                console.log("Direct Sent:",msg)
            });
        });

        $("#fanout_msg").click(function () {
            var msg = $("#inputmessage").val();
            $.post("/srr/self/sendFanoutMsg",{message:msg},function (){
                console.log("Fanout Sent:",msg)
            });
        });

        $("#topic_msg").click(function () {
            var msg = $("#inputmessage").val();
            $.post("/srr/self/sendTopicMsg",{message:msg},function (){
                console.log("Topic Sent:",msg)
            });
        });
    });
  </script>
</body>
</html>
self_send.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Self Receive Message Page</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
      $(document).ready(function () {
            $("#getDirectMessage").click(function (event) {
                $.get("/srr/self/getDirectMsg",function (obj) {
                    if(obj.length != 0){
                        $("#message").append("<li>Direct-->" + obj + "</li>");
                    }
                });
            });
            $("#getFanoutMessage").click(function (event) {
                $.get("/srr/self/getFanoutMsg",function (obj) {
                    if(obj.length != 0){
                        $("#message").append("<li>Fanout-->" + obj + "</li>");
                    }
                });
            });
            $("#getTopicMessage").click(function (event) {
                $.get("/srr/self/getTopicMsg",function (obj) {
                    if(obj.length != 0){
                        $("#message").append("<li>Topic-->" + obj + "</li>");
                    }
                });
            });
      });
    </script>
</head>
<body>
  <h1>Self Receive Message Page</h1>
  <ul id="message"></ul>
  <button id="getDirectMessage">Get Direct Message</button>
  <button id="getFanoutMessage">Get Fanout Message</button>
  <button id="getTopicMessage">Get Topic Message</button>
</body>
</html>
self_receive.html

■コンポーネント(Sender、Receiver)を追加

package com.example.srrwk.component;

import com.example.srrwk.config.SelfRabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageSelfSender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendDirectMessage(String message){
        System.out.println("Sending message: " + message);
        rabbitTemplate.convertAndSend(SelfRabbitMQConfig.LT_EXCHANGE_DIRECT_XX,SelfRabbitMQConfig.LT_ROUTING_KEY_DIRECT_XX,message);
    }

    public void sendFanoutMessage(String message){
        System.out.println("Sending message: " + message);
        rabbitTemplate.convertAndSend(SelfRabbitMQConfig.LT_EXCHANGE_FANOUT_XX,"",message);
    }

    public void sendTopicMessage(String message){
        System.out.println("Sending message: " + message);
        rabbitTemplate.convertAndSend(SelfRabbitMQConfig.LT_EXCHANGE_TOPIC_XX,SelfRabbitMQConfig.LT_ROUTING_KEY_TOPIC_XX,message);
    }

}
MessageSelfSender.java
package com.example.srrwk.component;

import com.example.srrwk.config.SelfRabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageSelfReceiver {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public String getDirectMessage(){
        Object msgObj = rabbitTemplate.receiveAndConvert(SelfRabbitMQConfig.LT_QUEUE_DIRECT_XX);
        String msg = "";
        if(msgObj != null){
            msg = msgObj.toString();
        }
        return msg;
    }

    public String getFanoutMessage(){
        Object msgObj = rabbitTemplate.receiveAndConvert(SelfRabbitMQConfig.LT_QUEUE_FANOUT_XX);
        String msg = "";
        if(msgObj != null){
            msg = msgObj.toString();
        }
        return msg;
    }

    public String getTopicMessage(){
        Object msgObj = rabbitTemplate.receiveAndConvert(SelfRabbitMQConfig.LT_QUEUE_TOPIC_XX);
        String msg = "";
        if(msgObj != null){
            msg = msgObj.toString();
        }
        return msg;
    }
}
MessageSelfReceiver.java

■コンフィグレーション(RabbitMQConfig)を追加

package com.example.srrwk.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SelfRabbitMQConfig {
    public static final String LT_EXCHANGE_DIRECT_XX="lt.exchange.direct.xx";
    public static final String LT_QUEUE_DIRECT_XX="lt.queue.direct.xx";
    public static final String LT_ROUTING_KEY_DIRECT_XX="lt.routingkey.direct.xx";

    public static final String LT_EXCHANGE_FANOUT_XX="lt.exchange.fanout.xx";
    public static final String LT_QUEUE_FANOUT_XX="lt.queue.fanout.xx";
//    public static final String LT_ROUTING_KEY_FANOUT_XX="lt.routingkey.fanout.xx";

    public static final String LT_EXCHANGE_TOPIC_XX="lt.exchange.topic.xx";
    public static final String LT_QUEUE_TOPIC_XX="lt.queue.topic.xx";
    public static final String LT_ROUTING_KEY_TOPIC_XX="lt.routingkey.topic.*";

    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange(LT_EXCHANGE_DIRECT_XX);
    }
    @Bean
    public Queue directQueue(){
        return new Queue(LT_QUEUE_DIRECT_XX);
    }
    @Bean
    public Binding directBinding(Queue directQueue, DirectExchange directExchange){
        return BindingBuilder.bind(directQueue).to(directExchange).with(LT_ROUTING_KEY_DIRECT_XX);
    }

    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange(LT_EXCHANGE_FANOUT_XX);
    }
    @Bean
    public Queue fanoutQueue(){
        return new Queue(LT_QUEUE_FANOUT_XX);
    }
    @Bean
    public Binding fanoutBinding(Queue fanoutQueue, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue).to(fanoutExchange);
    }

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange(LT_EXCHANGE_TOPIC_XX);
    }
    @Bean
    public Queue topicQueue(){
    return new Queue(LT_QUEUE_TOPIC_XX);
    }
    @Bean
    public Binding topicBinding(Queue topicQueue, TopicExchange topicExchange){
        return BindingBuilder.bind(topicQueue).to(topicExchange).with(SelfRabbitMQConfig.LT_ROUTING_KEY_TOPIC_XX);
    }
}
SelfRabbitMQConfig.java

※:このファイルは、ExchangeとQueueを紐付けるため、作成する。代わりに、RabbitMQの内部で手で作成できる。

■コントロール(Controller)を追加

package com.example.srrwk.controller;

import com.example.srrwk.component.MessageSelfReceiver;
import com.example.srrwk.component.MessageSelfSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/self")
public class SelfController {

    @Autowired
    MessageSelfSender sender;

    @Autowired
    MessageSelfReceiver receiver;

    @PostMapping("/sendDirectMsg")
    public void sendDirectMsg(@RequestParam("message") String message){
        sender.sendDirectMessage(message);
    }

    @GetMapping("/getDirectMsg")
    public String getDirectMsg(){
        return receiver.getDirectMessage();
    }

    @PostMapping("/sendFanoutMsg")
    public void sendFanoutMsg(@RequestParam("message") String message){
        sender.sendFanoutMessage(message);
    }

    @GetMapping("/getFanoutMsg")
    public String getFanoutMsg(){
        return receiver.getFanoutMessage();
    }

    @PostMapping("/sendTopicMsg")
    public void sendTopicMsg(@RequestParam("message") String message){
        sender.sendTopicMessage(message);
    }

    @GetMapping("/getTopicMsg")
    public String getTopicMsg(){
        return receiver.getTopicMessage();
    }
}
SelfController.java

■検証画面

Send画面:<http://localhost:8088/srr/self_send.html>

Receive画面:<http://localhost:8088/srr/self_receive.html>

■RabbitMQのインストール参考

URL: <https://www.cnblogs.com/lnsylt/p/14341074.html>