• 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

     

    消息发送

    依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-amqp</artifactId>
    4. </dependency>

    application.properties关键部分

    1. #Rabbitmq 配置
    2. #Rabbitmq broker主机
    3. spring.rabbitmq.host=localhost
    4. #Rabbitmq broker端口 默认为5672
    5. spring.rabbitmq.port=5672
    6. #Rabbitmq broker 访问用户名
    7. spring.rabbitmq.username=admin
    8. #Rabbitmq broker 访问密码
    9. spring.rabbitmq.password=admin

    关键代码RabbitOrderMessagingService

    1. package com.wdh.tacocloud.messaging;
    2. import com.wdh.tacocloud.domain.Order;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.amqp.AmqpException;
    5. import org.springframework.amqp.core.Message;
    6. import org.springframework.amqp.core.MessagePostProcessor;
    7. import org.springframework.amqp.core.MessageProperties;
    8. import org.springframework.amqp.rabbit.core.RabbitTemplate;
    9. import org.springframework.amqp.support.converter.MessageConverter;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import org.springframework.stereotype.Service;
    12. /**
    13. * @author WangDH
    14. * @create 2022-09-27 14:32
    15. */
    16. @Slf4j
    17. @Service
    18. public class RabbitOrderMessagingService implements OrderMessagingService {
    19. private RabbitTemplate rabbitTemplate;
    20. @Autowired
    21. public RabbitOrderMessagingService(RabbitTemplate rabbitTemplate) {
    22. this.rabbitTemplate = rabbitTemplate;
    23. }
    24. @Override
    25. public void sendOrder(Order order) {
    26. log.info("RabbitOrderMessagingService start sendOrder start.");
    27. //方式1
    28. String routingKey="tacocloud.order.queue";
    29. MessageConverter msgConverter=rabbitTemplate.getMessageConverter();
    30. MessageProperties props=new MessageProperties();
    31. Message message=msgConverter.toMessage(order,props);
    32. rabbitTemplate.send(routingKey,message);
    33. // //方式2
    34. // String routingKey="tacocloud.order.queue";
    35. // rabbitTemplate.convertAndSend(routingKey,order);
    36. // //方式3
    37. // //注意,需要事先通过浏览器在RabbitMQ的管理页面手动创建tacocloud.order.queue队列。本程序不会自动创建队列
    38. // // 注意,这里使用的是默认的exchange,
    39. // String routingKey="tacocloud.order.queue";
    40. // rabbitTemplate.convertAndSend(routingKey, order,
    41. // new MessagePostProcessor() {
    42. // @Override
    43. // public Message postProcessMessage(Message message) throws AmqpException {
    44. // MessageProperties properties=message.getMessageProperties();
    45. // properties.setHeader("X_ORDER_SOURCE","WEB");
    46. // return message;
    47. // }
    48. // });
    49. log.info("RabbitOrderMessagingService start sendOrder end.");
    50. }
    51. }

    RestController部分代码

    1. package com.wdh.tacocloud.api;
    2. import com.wdh.tacocloud.data.OrderRepository;
    3. import com.wdh.tacocloud.domain.Order;
    4. import com.wdh.tacocloud.messaging.OrderMessagingService;
    5. import lombok.extern.slf4j.Slf4j;
    6. import org.springframework.dao.EmptyResultDataAccessException;
    7. import org.springframework.http.HttpStatus;
    8. import org.springframework.web.bind.annotation.*;
    9. import java.text.SimpleDateFormat;
    10. import java.util.Date;
    11. import java.util.Optional;
    12. /**
    13. * @author WangDH
    14. * @create 2022-09-23 9:55
    15. */
    16. @Slf4j
    17. @RestController
    18. @RequestMapping(path="/orders",produces = "application/json")
    19. @CrossOrigin(origins = "*")
    20. public class OrderApiController {
    21. private OrderRepository orderRepo;
    22. private OrderMessagingService orderMessagingService;
    23. public OrderApiController(OrderRepository orderRepo
    24. ,OrderMessagingService orderMessagingService
    25. ) {
    26. this.orderMessagingService=orderMessagingService;
    27. this.orderRepo = orderRepo;
    28. }
    29. @GetMapping("/")
    30. public String getDefault(){
    31. log.info("######### OrderApiController enter getDefault");
    32. return "ok,this is OrderApiController getDefault return";
    33. }
    34. @GetMapping("/sendMQ")
    35. public String sendMQ(){
    36. log.info("######### OrderApiController enter sendMQ");
    37. Date date=new Date();
    38. SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    39. String time=formatter.format(date);
    40. Order order=new Order();
    41. order.setId((long) 81);
    42. order.setDeliveryName("jmsTestName"+time);
    43. orderMessagingService.sendOrder(order);
    44. return "ok,this is OrderApiController sendMQ return。time="+time;
    45. }
    46. @PutMapping("/{orderId}")
    47. public Order putOrder(@RequestBody Order order){
    48. Order orderSaved=orderRepo.save(order);
    49. return orderSaved;
    50. }
    51. }

    消息接收

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

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

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

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

    依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-amqp</artifactId>
    4. </dependency>

    application.propertites中关键部分

    1. #Rabbitmq 配置
    2. #Rabbitmq broker主机
    3. spring.rabbitmq.host=localhost
    4. #Rabbitmq broker端口 默认为5672
    5. spring.rabbitmq.port=5672
    6. #Rabbitmq broker 访问用户名
    7. spring.rabbitmq.username=admin
    8. #Rabbitmq broker 访问密码
    9. spring.rabbitmq.password=admin

    消息接收代码-拉模型

    1. package com.wdh.tacocloud_kitchen.kitchen.messaging.rabbitmq;
    2. import com.wdh.tacocloud_kitchen.OrderReceiver;
    3. import com.wdh.tacocloud.domain.Order;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.amqp.core.Message;
    6. import org.springframework.amqp.rabbit.core.RabbitTemplate;
    7. import org.springframework.amqp.support.converter.MessageConverter;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.stereotype.Component;
    10. import java.util.Date;
    11. /**
    12. * @author WangDH
    13. * @create 2022-09-27 17:21 * *
    14. * 注意,这种方式是[拉模型]
    15. */
    16. @Slf4j
    17. @Component
    18. public class RabbitOrderReceiver implements OrderReceiver {
    19. private RabbitTemplate rabbitTemplate;
    20. private MessageConverter messageConverter;
    21. @Autowired
    22. public RabbitOrderReceiver(RabbitTemplate rabbitTemplate) {
    23. this.rabbitTemplate = rabbitTemplate;
    24. this.messageConverter=rabbitTemplate.getMessageConverter();
    25. }
    26. @Override
    27. public Order receiveOrder() {
    28. //方式1
    29. String queueName="tacocloud.order.queue";
    30. Message message = rabbitTemplate.receive(queueName,10*1000);
    31. log.info("RabbitOrderReceiver receiveOrder message="+message.toString());
    32. Object obj=messageConverter.fromMessage(message);
    33. Order order=(Order)obj;
    34. // //方式3
    35. // String queueName="tacocloud.order.queue";
    36. // Object obj= rabbitTemplate.receiveAndConvert(queueName);
    37. // Order order=(Order)obj;
    38. log.info("RabbitOrderReceiver receiveOrder receiveAndConvert end at "+(new Date()).toString());
    39. return order;
    40. }
    41. }

    消息接收代码-推模型

    1. package com.wdh.tacocloud_kitchen.kitchen.messaging.rabbitmq.listener;
    2. import com.wdh.tacocloud.domain.Order;
    3. import com.wdh.tacocloud_kitchen.KitchenUI;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.amqp.rabbit.annotation.RabbitListener;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Component;
    8. /**
    9. * @author WangDH
    10. * @create 2022-09-27 17:33
    11. *
    12. * 建立监听器以配合消息队列实现【推模型】
    13. *
    14. * 注意,这个与RabbitOrderReceiver的拉模型互斥,二者代码只能选择一个
    15. * 如果同时使用【推模型】OrderListener和【拉模型】RabbitOrderReceiver,
    16. * 则【推模型】OrderListener会优先截取队列的消息,导致【拉模型】RabbitOrderReceiver接收到的数据为空
    17. */
    18. @Slf4j
    19. @Component
    20. public class OrderListener {
    21. private KitchenUI kitchenUI;
    22. @Autowired
    23. public OrderListener(KitchenUI kitchenUI) {
    24. this.kitchenUI = kitchenUI;
    25. }
    26. @RabbitListener(queues = "tacocloud.order.queue")//注意这个queue需要在程序运行前,手工从Rabbitmq的管理页面手工建立
    27. public void receiveOrder(Order order){
    28. kitchenUI.displayOrder(order);
    29. }
    30. }

    测试消息发送与接收

    1.保证RabbitMQ正在运行中

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

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

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

    IDEA日志如下

    1. "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
    2. . ____ _ __ _ _
    3. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    4. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    5. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
    6. ' |____| .__|_| |_|_| |_\__, | / / / /
    7. =========|_|==============|___/=/_/_/_/
    8. :: Spring Boot :: (v2.3.7.RELEASE)
    9. 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)
    10. 2022-09-30 16:43:12.480 INFO 5796 --- [ restartedMain] com.wdh.tacocloud.TacocloudApplication : No active profile set, falling back to default profiles: default
    11. 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
    12. 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'
    13. 2022-09-30 16:43:14.028 INFO 5796 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
    14. 2022-09-30 16:43:14.044 INFO 5796 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
    15. 2022-09-30 16:43:14.044 INFO 5796 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
    16. 2022-09-30 16:43:14.091 INFO 5796 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
    17. 2022-09-30 16:43:14.091 INFO 5796 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1533 ms
    18. 2022-09-30 16:43:15.167 INFO 5796 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
    19. 2022-09-30 16:43:15.588 INFO 5796 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
    20. Using generated security password: ef5f6292-60d2-4624-afab-2fe01faa4e3a
    21. 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]
    22. 2022-09-30 16:43:15.791 INFO 5796 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
    23. 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 ''
    24. 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日志如下

    1. "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
    2. . ____ _ __ _ _
    3. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    4. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    5. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
    6. ' |____| .__|_| |_|_| |_\__, | / / / /
    7. =========|_|==============|___/=/_/_/_/
    8. :: Spring Boot :: (v2.3.7.RELEASE)
    9. 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)
    10. 2022-09-30 16:44:12.471 INFO 1060 --- [ restartedMain] c.w.t.TacocloudKitchenApplication : No active profile set, falling back to default profiles: default
    11. 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
    12. 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'
    13. 2022-09-30 16:44:13.485 INFO 1060 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8082 (http)
    14. 2022-09-30 16:44:13.485 INFO 1060 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
    15. 2022-09-30 16:44:13.485 INFO 1060 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
    16. 2022-09-30 16:44:13.547 INFO 1060 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
    17. 2022-09-30 16:44:13.547 INFO 1060 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1014 ms
    18. 2022-09-30 16:44:14.046 INFO 1060 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
    19. 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.
    20. 2022-09-30 16:44:14.202 WARN 1060 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Unable to start LiveReload server
    21. 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 ''
    22. 2022-09-30 16:44:14.249 INFO 1060 --- [ restartedMain] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]
    23. 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]
    24. 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中提示的密码复制过来再回车,登录后,网页提示消息已发送。

    1. 2022-09-30 16:43:15.588 INFO 5796 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
    2. Using generated security password: ef5f6292-60d2-4624-afab-2fe01faa4e3a

     

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

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

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

  • 相关阅读:
    Python【理解标识符的定义】
    Linux进程概念详解
    如何设计对外接口
    可能是最全的:虚拟机使用失败解决方案汇总
    【postgres】pgbackrest 冷备份介绍、命令、脚本
    复杂数据没头绪?
    C语言描述数据结构 —— 常见排序(1)直接插入排序、希尔排序、选择排序、堆排序
    多路转接(上)——select
    高压配电安全监测系统:确保电力系统的稳定运行
    SQL如何导入数据以及第一次上机作业
  • 原文地址:https://blog.csdn.net/wangdonghao137/article/details/127125648