高级农民工(H.F.H)
我思,故我在!(僕なら、僕ができる!)

导航

 

 

■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>

■補足(非同期処理)

package com.example.srrwk.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class AsyncRabbitMQConfig {
    @Bean
    public Queue queue(){
        return new Queue("lt.async.queue",false);
    }

    @Bean
    public TopicExchange exchange(){
        return new TopicExchange("lt.async.exchange");
    }

    @Bean
    public Binding binding(Queue queue, TopicExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("lt.routing.key");
    }

    @Bean
    public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory cf){
        RabbitTemplate template = new RabbitTemplate(cf);
        template.setMessageConverter(jsonMessageConverter());
        return template;
    }
}
AsyncRabbitMQConfig.java
package com.example.srrwk.service;

import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;

@Service
public class AsyncMessgeProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private TopicExchange exchange;

    /**
     * 同步发送
     * @param message
     */
    public void sendMessage(String message){
        rabbitTemplate.convertAndSend(exchange.getName(),"lt.routing.key",message);
    }

    /**
     * 异步发送
     * @param message
     * @return
     */
    @Async
    public CompletableFuture<Void> sendMessageAsync(String message){
        rabbitTemplate.convertAndSend(exchange.getName(),"lt.routing.key",message);
        return CompletableFuture.completedFuture(null);
    }

}
AsyncMessgeProducer.java
package com.example.srrwk.service;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncMessageConsumer {

    /**
     * 同步接收
     * @param message
     */
    @RabbitListener(queues = "lt.async.queue")
    public void receiveMessage(String message){
        System.out.println("Received message:"+message);
    }

    /**
     * 异步接收
     * @param message
     */
    @Async
    @RabbitListener(queues = "lt.async.queue")
    public void receiveMessageAsync(String message){
        System.out.println("Received message:"+message);
        try{
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Message processed:"+message);
    }
}
AsyncMessageConsumer.java
package com.example.srrwk.controller;

import com.example.srrwk.service.AsyncMessgeProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncMessageController {

    @Autowired
    private AsyncMessgeProducer producer;

    /**
     * 同步发送
     * @param message
     * @return
     */
    @PostMapping("/send")
    public String sendMessage(@RequestParam("message") String message){
        producer.sendMessage(message);
        return "Message sent:"+message;
    }

    /**
     * 异步发送
     * @param message
     * @return
     */
    @PostMapping("/sendAsync")
    public String sendMessageAsync(@RequestParam("message") String message){
        producer.sendMessageAsync(message);
        return "Message Async sent:"+message;
    }

}
AsyncMessageController.java
package com.example.srrwk;

import com.example.srrwk.component.MessageSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
//开启异步
@EnableAsync
public class SrrWkApplication implements CommandLineRunner {

    @Autowired
    private MessageSender messageSender;

    public static void main(String[] args) {
        SpringApplication.run(SrrWkApplication.class, args);
    }


    @Override
    public void run(String... args) throws Exception {
        messageSender.sendDirectMessage("Hello, Direct Exchange!!");
        messageSender.sendTopicMessage("Hello, Topic Exchange!!");
        messageSender.sendFanoutMessage("Hello, Fanout Exchange!!");
    }
}
SrrWkApplication.java

 

posted on 2023-11-30 17:03  农民工024  阅读(4)  评论(0编辑  收藏  举报