当前位置: 首页 > news >正文

Spring In Action 5 学习笔记 chapter8 RabbitMQ(AMQP)要点

本文记录Sping In Action5 第8章 发送异步消息 RabbitMQ(AMQP)中的踩坑情况。

网搜的Spring In Action5的书籍在线翻译

https://potoyang.gitbook.io/spring-in-action-v5/

第8章的源码请自行github或gitee搜索,或参考一下。

GitHub - habuma/spring-in-action-5-samples: Home for example code from Spring in Action 5.

drop1et/spring-in-action-5-samples

操作系统及IDE环境

win7 x64

jdk 1.8

idea 2018.3

RabbitMQ(AMQP)

RabbitMQ版本号:rabbitmq_server-3.8.1

下载、安装、启动步骤请网搜。

官网:https://www.rabbitmq.com/

本地安装和启动服务后可通过浏览器访问管理页面http://localhost:15672/

账号密码默认为admin

 

消息发送

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

application.properties关键部分

#Rabbitmq 配置
#Rabbitmq broker主机
spring.rabbitmq.host=localhost
#Rabbitmq broker端口 默认为5672
spring.rabbitmq.port=5672
#Rabbitmq broker 访问用户名
spring.rabbitmq.username=admin
#Rabbitmq broker 访问密码
spring.rabbitmq.password=admin

关键代码RabbitOrderMessagingService

package com.wdh.tacocloud.messaging;


import com.wdh.tacocloud.domain.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @author WangDH
 * @create 2022-09-27 14:32
 */
@Slf4j
@Service
public class RabbitOrderMessagingService implements OrderMessagingService {

    private RabbitTemplate rabbitTemplate;

    @Autowired
    public RabbitOrderMessagingService(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }


    @Override
    public void sendOrder(Order order) {
        log.info("RabbitOrderMessagingService start sendOrder start.");


        //方式1
        String routingKey="tacocloud.order.queue";

        MessageConverter msgConverter=rabbitTemplate.getMessageConverter();
        MessageProperties props=new MessageProperties();
        Message message=msgConverter.toMessage(order,props);

        rabbitTemplate.send(routingKey,message);



//        //方式2
//        String routingKey="tacocloud.order.queue";
//        rabbitTemplate.convertAndSend(routingKey,order);


//        //方式3
//        //注意,需要事先通过浏览器在RabbitMQ的管理页面手动创建tacocloud.order.queue队列。本程序不会自动创建队列
//        // 注意,这里使用的是默认的exchange,
//        String routingKey="tacocloud.order.queue";
//        rabbitTemplate.convertAndSend(routingKey, order,
//                new MessagePostProcessor() {
//                    @Override
//                    public Message postProcessMessage(Message message) throws AmqpException {
//                        MessageProperties properties=message.getMessageProperties();
//                        properties.setHeader("X_ORDER_SOURCE","WEB");
//                        return message;
//                    }
//                });

        log.info("RabbitOrderMessagingService start sendOrder end.");
    }

}

RestController部分代码

package com.wdh.tacocloud.api;

import com.wdh.tacocloud.data.OrderRepository;
import com.wdh.tacocloud.domain.Order;
import com.wdh.tacocloud.messaging.OrderMessagingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Optional;

/**
 * @author WangDH
 * @create 2022-09-23 9:55
 */
@Slf4j
@RestController
@RequestMapping(path="/orders",produces = "application/json")
@CrossOrigin(origins = "*")
public class OrderApiController {

    private OrderRepository orderRepo;
    private OrderMessagingService orderMessagingService;


    public OrderApiController(OrderRepository orderRepo
                              ,OrderMessagingService orderMessagingService
    ) {
        this.orderMessagingService=orderMessagingService;
        this.orderRepo = orderRepo;
    }

    @GetMapping("/")
    public String getDefault(){

        log.info("######### OrderApiController enter getDefault");


        return "ok,this is OrderApiController getDefault return";
    }

    @GetMapping("/sendMQ")
    public String sendMQ(){

        log.info("######### OrderApiController enter sendMQ");

        Date date=new Date();
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time=formatter.format(date);


        Order order=new Order();
        order.setId((long) 81);
        order.setDeliveryName("jmsTestName"+time);
        orderMessagingService.sendOrder(order);

        return "ok,this is OrderApiController sendMQ return。time="+time;
    }

    @PutMapping("/{orderId}")
    public Order putOrder(@RequestBody Order order){
        Order orderSaved=orderRepo.save(order);
        return orderSaved;
    }


}

消息接收

要点1:【推模型】OrderListener和【拉模型】RabbitOrderReceiver互斥,二者代码只能选择一个

要点2:如果同时使用【推模型】OrderListener和【拉模型】RabbitOrderReceiver,则【推模型】OrderListener会优先截取队列的消息,导致【拉模型】RabbitOrderReceiver接收到的数据为空。

要点3:【拉模型】类RabbitOrderReceiver的receiveOrder()方法中的receiveAndConvert()会阻塞直到发送端有数据发送。

消息接收端程序采用SpringMVC+Thymeleaf

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

application.propertites中关键部分

#Rabbitmq 配置
#Rabbitmq broker主机
spring.rabbitmq.host=localhost
#Rabbitmq broker端口 默认为5672
spring.rabbitmq.port=5672
#Rabbitmq broker 访问用户名
spring.rabbitmq.username=admin
#Rabbitmq broker 访问密码
spring.rabbitmq.password=admin

消息接收代码-拉模型

package com.wdh.tacocloud_kitchen.kitchen.messaging.rabbitmq;

import com.wdh.tacocloud_kitchen.OrderReceiver;
import com.wdh.tacocloud.domain.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;

/**
 * @author WangDH
 * @create 2022-09-27 17:21 * *
 * 注意,这种方式是[拉模型]
 */

@Slf4j
@Component
public class RabbitOrderReceiver implements OrderReceiver {

    private RabbitTemplate rabbitTemplate;
    private MessageConverter messageConverter;

    @Autowired
    public RabbitOrderReceiver(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
        this.messageConverter=rabbitTemplate.getMessageConverter();
    }

    @Override
    public Order receiveOrder() {

        //方式1
        String queueName="tacocloud.order.queue";
        Message message = rabbitTemplate.receive(queueName,10*1000);

        log.info("RabbitOrderReceiver receiveOrder message="+message.toString());

        Object obj=messageConverter.fromMessage(message);
        Order order=(Order)obj;


//        //方式3
//        String queueName="tacocloud.order.queue";
//        Object obj= rabbitTemplate.receiveAndConvert(queueName);
//        Order order=(Order)obj;



        log.info("RabbitOrderReceiver receiveOrder receiveAndConvert end at "+(new Date()).toString());
        return order;
    }
}

消息接收代码-推模型

package com.wdh.tacocloud_kitchen.kitchen.messaging.rabbitmq.listener;

import com.wdh.tacocloud.domain.Order;
import com.wdh.tacocloud_kitchen.KitchenUI;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author WangDH
 * @create 2022-09-27 17:33
 *
 * 建立监听器以配合消息队列实现【推模型】
 *
 * 注意,这个与RabbitOrderReceiver的拉模型互斥,二者代码只能选择一个
 * 如果同时使用【推模型】OrderListener和【拉模型】RabbitOrderReceiver,
 * 则【推模型】OrderListener会优先截取队列的消息,导致【拉模型】RabbitOrderReceiver接收到的数据为空
 */
@Slf4j
@Component
public class OrderListener {

    private KitchenUI kitchenUI;

    @Autowired
    public OrderListener(KitchenUI kitchenUI) {
        this.kitchenUI = kitchenUI;
    }


    @RabbitListener(queues = "tacocloud.order.queue")//注意这个queue需要在程序运行前,手工从Rabbitmq的管理页面手工建立
    public void receiveOrder(Order order){

        kitchenUI.displayOrder(order);
    }

}

测试消息发送与接收

1.保证RabbitMQ正在运行中

打开浏览器输入http://localhost:15672/进入RabbitMQ管理页面,在页面中点击Queue选项卡下的Add queue手工在默认exchange下创建一个队列名称为【tacocloud.order.queue

注意:这个Queue必须事先创建好

2.启动发送端springboot程序TacocloudJmsApplication(端口8080)

IDEA日志如下

"C:\Program Files\Java\jdk1.8.0_111\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\JavaDevEnv\JetBrains\IntelliJ IDEA 2018.3.6\lib\idea_rt.jar=7397:D:\JavaDevEnv\JetBrains\IntelliJ IDEA 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_111\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\rt.jar;D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq\tacocloud\target\classes;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter\2.3.7.RELEASE\spring-boot-starter-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot\2.3.7.RELEASE\spring-boot-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-context\5.2.12.RELEASE\spring-context-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-autoconfigure\2.3.7.RELEASE\spring-boot-autoconfigure-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-logging\2.3.7.RELEASE\spring-boot-starter-logging-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\JavaDevEnv\maven_repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\JavaDevEnv\maven_repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;D:\JavaDevEnv\maven_repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;D:\JavaDevEnv\maven_repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\JavaDevEnv\maven_repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-core\5.2.12.RELEASE\spring-core-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-jcl\5.2.12.RELEASE\spring-jcl-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-web\2.3.7.RELEASE\spring-boot-starter-web-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-json\2.3.7.RELEASE\spring-boot-starter-json-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.7.RELEASE\spring-boot-starter-tomcat-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;D:\JavaDevEnv\maven_repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-web\5.2.12.RELEASE\spring-web-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-webmvc\5.2.12.RELEASE\spring-webmvc-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-expression\5.2.12.RELEASE\spring-expression-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-devtools\2.3.7.RELEASE\spring-boot-devtools-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;D:\JavaDevEnv\maven_repository\Mysql\mysql-connector-java\8.0.22\mysql-connector-java-8.0.22.jar;D:\JavaDevEnv\maven_repository\org\springframework\data\spring-data-commons\2.3.6.RELEASE\spring-data-commons-2.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-beans\5.2.12.RELEASE\spring-beans-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-jdbc\2.3.7.RELEASE\spring-boot-starter-jdbc-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-jdbc\5.2.12.RELEASE\spring-jdbc-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-tx\5.2.12.RELEASE\spring-tx-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-hateoas\2.3.7.RELEASE\spring-boot-starter-hateoas-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\hateoas\spring-hateoas\1.1.3.RELEASE\spring-hateoas-1.1.3.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\plugin\spring-plugin-core\2.0.0.RELEASE\spring-plugin-core-2.0.0.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-data-rest\2.3.7.RELEASE\spring-boot-starter-data-rest-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\data\spring-data-rest-webmvc\3.3.6.RELEASE\spring-data-rest-webmvc-3.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\data\spring-data-rest-core\3.3.6.RELEASE\spring-data-rest-core-3.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\atteo\evo-inflector\1.2.2\evo-inflector-1.2.2.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-validation\2.3.7.RELEASE\spring-boot-starter-validation-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;D:\JavaDevEnv\maven_repository\org\hibernate\validator\hibernate-validator\6.1.6.Final\hibernate-validator-6.1.6.Final.jar;D:\JavaDevEnv\maven_repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\JavaDevEnv\maven_repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-security\2.7.3\spring-boot-starter-security-2.7.3.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-aop\5.2.12.RELEASE\spring-aop-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\security\spring-security-config\5.3.6.RELEASE\spring-security-config-5.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\security\spring-security-core\5.3.6.RELEASE\spring-security-core-5.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\security\spring-security-web\5.3.6.RELEASE\spring-security-web-5.3.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-amqp\2.3.7.RELEASE\spring-boot-starter-amqp-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-messaging\5.2.12.RELEASE\spring-messaging-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\amqp\spring-rabbit\2.2.13.RELEASE\spring-rabbit-2.2.13.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\rabbitmq\amqp-client\5.9.0\amqp-client-5.9.0.jar;D:\JavaDevEnv\maven_repository\org\springframework\amqp\spring-amqp\2.2.13.RELEASE\spring-amqp-2.2.13.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\retry\spring-retry\1.2.5.RELEASE\spring-retry-1.2.5.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;D:\JavaDevEnv\maven_repository\net\minidev\json-smart\2.3\json-smart-2.3.jar;D:\JavaDevEnv\maven_repository\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;D:\JavaDevEnv\maven_repository\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar" com.wdh.tacocloud.TacocloudApplication

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.7.RELEASE)

2022-09-30 16:43:12.480  INFO 5796 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : Starting TacocloudApplication on 14JPYI7CBESDNFK with PID 5796 (D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq\tacocloud\target\classes started by Administrator in D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq)
2022-09-30 16:43:12.480  INFO 5796 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : No active profile set, falling back to default profiles: default
2022-09-30 16:43:12.542  INFO 5796 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2022-09-30 16:43:12.558  INFO 5796 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2022-09-30 16:43:14.028  INFO 5796 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-09-30 16:43:14.044  INFO 5796 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-09-30 16:43:14.044  INFO 5796 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2022-09-30 16:43:14.091  INFO 5796 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-09-30 16:43:14.091  INFO 5796 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1533 ms
2022-09-30 16:43:15.167  INFO 5796 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-09-30 16:43:15.588  INFO 5796 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: ef5f6292-60d2-4624-afab-2fe01faa4e3a

2022-09-30 16:43:15.729  INFO 5796 --- [  restartedMain] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@54979466, org.springframework.security.web.context.SecurityContextPersistenceFilter@3ad8bc1b, org.springframework.security.web.header.HeaderWriterFilter@16ee7f9e, org.springframework.security.web.csrf.CsrfFilter@1d2799ba, org.springframework.security.web.authentication.logout.LogoutFilter@2ba2cf2f, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@a0d6163, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@14e0f0ff, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@5e770a8f, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@2bb728e6, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@c06c054, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@131cce45, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6bc4b007, org.springframework.security.web.session.SessionManagementFilter@7cbe8286, org.springframework.security.web.access.ExceptionTranslationFilter@7312ded, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@59aa20fa]
2022-09-30 16:43:15.791  INFO 5796 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2022-09-30 16:43:15.822  INFO 5796 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-09-30 16:43:15.822  INFO 5796 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : Started TacocloudApplication in 3.646 seconds (JVM running for 4.325)

3.启动接收端springboot程序TacocloudKitchenApplication(端口8082)

IDEA日志如下

"C:\Program Files\Java\jdk1.8.0_111\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\JavaDevEnv\JetBrains\IntelliJ IDEA 2018.3.6\lib\idea_rt.jar=7469:D:\JavaDevEnv\JetBrains\IntelliJ IDEA 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_111\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\rt.jar;D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq\tacocloud_kitchen_rabbitmq\target\classes;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.3.7.RELEASE\spring-boot-starter-thymeleaf-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter\2.3.7.RELEASE\spring-boot-starter-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-logging\2.3.7.RELEASE\spring-boot-starter-logging-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\JavaDevEnv\maven_repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\JavaDevEnv\maven_repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;D:\JavaDevEnv\maven_repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;D:\JavaDevEnv\maven_repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\JavaDevEnv\maven_repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\JavaDevEnv\maven_repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;D:\JavaDevEnv\maven_repository\org\thymeleaf\thymeleaf-spring5\3.0.11.RELEASE\thymeleaf-spring5-3.0.11.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\thymeleaf\thymeleaf\3.0.11.RELEASE\thymeleaf-3.0.11.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\JavaDevEnv\maven_repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.4.RELEASE\thymeleaf-extras-java8time-3.0.4.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-web\2.3.7.RELEASE\spring-boot-starter-web-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-json\2.3.7.RELEASE\spring-boot-starter-json-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;D:\JavaDevEnv\maven_repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.7.RELEASE\spring-boot-starter-tomcat-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;D:\JavaDevEnv\maven_repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;D:\JavaDevEnv\maven_repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-web\5.2.12.RELEASE\spring-web-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-beans\5.2.12.RELEASE\spring-beans-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-webmvc\5.2.12.RELEASE\spring-webmvc-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-aop\5.2.12.RELEASE\spring-aop-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-context\5.2.12.RELEASE\spring-context-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-expression\5.2.12.RELEASE\spring-expression-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-devtools\2.3.7.RELEASE\spring-boot-devtools-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot\2.3.7.RELEASE\spring-boot-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-autoconfigure\2.3.7.RELEASE\spring-boot-autoconfigure-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;D:\JavaDevEnv\maven_repository\org\springframework\boot\spring-boot-starter-amqp\2.3.7.RELEASE\spring-boot-starter-amqp-2.3.7.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-messaging\5.2.12.RELEASE\spring-messaging-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\amqp\spring-rabbit\2.2.13.RELEASE\spring-rabbit-2.2.13.RELEASE.jar;D:\JavaDevEnv\maven_repository\com\rabbitmq\amqp-client\5.9.0\amqp-client-5.9.0.jar;D:\JavaDevEnv\maven_repository\org\springframework\amqp\spring-amqp\2.2.13.RELEASE\spring-amqp-2.2.13.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\retry\spring-retry\1.2.5.RELEASE\spring-retry-1.2.5.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-tx\5.2.12.RELEASE\spring-tx-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-core\5.2.12.RELEASE\spring-core-5.2.12.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\springframework\spring-jcl\5.2.12.RELEASE\spring-jcl-5.2.12.RELEASE.jar;D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq\tacocloud\target\classes" com.wdh.tacocloud_kitchen.TacocloudKitchenApplication

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.7.RELEASE)

2022-09-30 16:44:12.471  INFO 1060 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : Starting TacocloudKitchenApplication on 14JPYI7CBESDNFK with PID 1060 (D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq\tacocloud_kitchen_rabbitmq\target\classes started by Administrator in D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_rabbitmq)
2022-09-30 16:44:12.471  INFO 1060 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : No active profile set, falling back to default profiles: default
2022-09-30 16:44:12.533  INFO 1060 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2022-09-30 16:44:12.533  INFO 1060 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2022-09-30 16:44:13.485  INFO 1060 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
2022-09-30 16:44:13.485  INFO 1060 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-09-30 16:44:13.485  INFO 1060 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2022-09-30 16:44:13.547  INFO 1060 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-09-30 16:44:13.547  INFO 1060 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1014 ms
2022-09-30 16:44:14.046  INFO 1060 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-09-30 16:44:14.140  WARN 1060 --- [  restartedMain] org.thymeleaf.templatemode.TemplateMode  : [THYMELEAF][restartedMain] Template Mode 'HTML5' is deprecated. Using Template Mode 'HTML' instead.
2022-09-30 16:44:14.202  WARN 1060 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : Unable to start LiveReload server
2022-09-30 16:44:14.249  INFO 1060 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2022-09-30 16:44:14.249  INFO 1060 --- [  restartedMain] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [localhost:5672]
2022-09-30 16:44:14.296  INFO 1060 --- [  restartedMain] o.s.a.r.c.CachingConnectionFactory       : Created new connection: rabbitConnectionFactory#7650449e:0/SimpleConnection@4cada0ff [delegate=amqp://admin@127.0.0.1:5672/, localPort= 7487]
2022-09-30 16:44:14.358  INFO 1060 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : Started TacocloudKitchenApplication in 2.254 seconds (JVM running for 2.952)

4.打开浏览器输入【http://localhost:8080/orders/sendMQ】以调用发送端程序的rest服务,回车后因spring security要求先输入用户名user,再根据idea中提示的密码复制过来再回车,登录后,网页提示消息已发送。

2022-09-30 16:43:15.588  INFO 5796 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: ef5f6292-60d2-4624-afab-2fe01faa4e3a

 

5.接收端【拉模式】,在发送端已发送消息后, 打开浏览器输入【http://localhost:8081/orders/receive】回车会跳转到receiveOrder.html显示相应信息。(如果再次发送消息,则需要手动刷新浏览器以再次拉取消息)

再次提醒,【拉模式】和【推模式】互斥,二者只能保留其中一种模式代码。(例如使用拉模式时,将[推模式]OrderListener类的代码注释掉)

6.接收端【推模式】,在发送端已发送消息后,在IDEA的控制台中即可看到TacocloudKitchenApplication程序输出的日志显示OrderListener已收到消息。

相关文章:

  • K8s有状态应用(StatefulSet)之Mysql集群
  • 原生table动态数据,通过jQuery实现相同数据时候跨行合并
  • 祖国啊,情深难载
  • 纯JavaScript实现表白代码
  • SpringCloudGateway 学习笔记 - 搭建项目
  • MySQL学习笔记:一条SQL语句的执行过程
  • Springboot框架建立(1)
  • mongodb数据模型设计
  • Java学习笔记:SQLite数据库
  • 通过mockjs生成随机响应数据
  • VGG16-好莱坞明星识别
  • 《运营商劫持, 中间人攻击, 黑客入侵怎么办?》- HTTPS 技术反制
  • Vue项目的记录(七)
  • 【云原生 • Kubernetes】集群资源监控概述、监控平台的搭建
  • SpringCloud Stream基本使用
  • Android优雅地处理按钮重复点击
  • linux学习笔记
  • nodejs调试方法
  • node和express搭建代理服务器(源码)
  • Node项目之评分系统(二)- 数据库设计
  • overflow: hidden IE7无效
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue--为什么data属性必须是一个函数
  • 闭包,sync使用细节
  • 对象引论
  • 服务器从安装到部署全过程(二)
  • 规范化安全开发 KOA 手脚架
  • 前端存储 - localStorage
  • 如何胜任知名企业的商业数据分析师?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我建了一个叫Hello World的项目
  • 自动记录MySQL慢查询快照脚本
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 第二十章:异步和文件I/O.(二十三)
  • 进程与线程(三)——进程/线程间通信
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #DBA杂记1
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (2.2w字)前端单元测试之Jest详解篇
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (算法)Game
  • (转)3D模板阴影原理
  • (转)JAVA中的堆栈
  • (转)关于多人操作数据的处理策略
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .htaccess配置常用技巧
  • .net/c# memcached 获取所有缓存键(keys)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET中winform传递参数至Url并获得返回值或文件
  • @ComponentScan比较
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节