Spring In Action 5 学习笔记 chapter8 Kafka发送接收消息 要点

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

第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

目录

目录

目录

环境

Kafka在SpringBoot程序中的应用

环境

消息发送

依赖

application.properties关键部分

关键代码KafkaOrderMessagingService

RestController部分代码

消息接收

依赖

application.propertites中关键部分

踩坑提示

消息接收代码-推模型

测试消息发送与接收

其他-关于IDEA中一个Project项目内包含多个子工程及添加单向依赖的办法

环境

win7 x64

jdk 1.8

idea 2018.3

Kafka在SpringBoot程序中的应用

环境

Kafka依赖于zookeeper需要先安装zookeeper

zookeeper版本:apache-zookeeper-3.8.0-bin

Kafka版本号:kafka_2.13-3.2.3

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

安装的基本参考(不要参考此文中的测试命令,测试命令已过时)https://www.cnblogs.com/azhuya/p/15125433.html


测试命令参考(将linux下的bin/XXX.sh 改为window下的.\bin\windows\XXX.bat  )https://kafka.apache.org/quickstart

注意使用cmd窗口将zookeeper及kafka分别启动后,不要关闭cmd窗口,以便保留程序。

本文kafka服务器与开发程序在同一机器上,暂未考虑跨域问题。

消息发送

依赖

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

application.properties关键部分

#kafka 配置
#kafka broker 集群服务器地址端口(可以是多个地址)端口默认为9092
spring.kafka.bootstrap-servers=localhost:9092
#kafka设置key的序列化器
spring.kafka.producer.key-serializer=org.springframework.kafka.support.serializer.JsonSerializer
#kafka设置value的序列化器
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer

关键代码KafkaOrderMessagingService

package com.wdh.tacocloud.messaging;


import com.wdh.tacocloud.domain.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Service;
import org.springframework.util.concurrent.ListenableFuture;


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

    private KafkaTemplate<String,Order> kafkaTemplate;

    @Autowired
    public KafkaOrderMessagingService(KafkaTemplate<String,Order> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }


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


        //本代码环境
        //java版本:java version "1.8.0_111"
        //zookeeper版本:apache-zookeeper-3.8.0-bin
        //kafka版本:kafka_2.13-3.2.3

        String topic="wdhtacocloud-events";//"quickstart-events";//注意:本程序启动前,需要手动通过kafka手工创建名为【wdhtacocloud-events】的topic,且不要乱写数据以防止反序列化失败
        ListenableFuture<SendResult<String,Order>> result= kafkaTemplate.send(topic,order);

        log.info("KafkaOrderMessagingService 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 Kafka");

        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 Kafka return。time="+time;
    }

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



}

消息接收

要点1:使用kafka时,springboot只提供了依赖监听器的【推模型】OrderListener,并没有【拉模型】

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

依赖

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

application.propertites中关键部分

#kafka 配置
#kafka broker 集群服务器地址端口(可以是多个地址)端口默认为9092
spring.kafka.bootstrap-servers=localhost:9092
#kafka 设置消费者端的group id
spring.kafka.consumer.group-id=tacocloud_kitchen

#设置从kafka取数据的偏移量
#spring.kafka.consumer.auto-offset-reset=latest

#kafka 设置消费者端对key的反序列化器
spring.kafka.consumer.key-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
#kafka 设置消费者端对value的反序列化器(注意,不是JsonSerializer)
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
#kafka 需要在消费者端设置对消息对象的包设置信任,否则会报错【Consumer exception java.lang.IllegalStateException: This error handler cannot process 'SerializationException's directly; please consider configuring an 'ErrorHandlingDeserializer' in the value and/or key deserializer】
# 注意错误排查2,因kafka会自动对消息队列中的历史消息进行反序列化,如果消息队列历史有乱消息,建议新建topic,以保证队列中的消息全为合法的可反序列化的数据
spring.kafka.consumer.properties.spring.json.trusted.packages:*

踩坑提示

#kafka 需要在消费者端application.properties设置对消息对象的包设置信任,否则会报错【Consumer exception java.lang.IllegalStateException: This error handler cannot process 'SerializationException's directly; please consider configuring an 'ErrorHandlingDeserializer' in the value and/or key deserializer】
spring.kafka.consumer.properties.spring.json.trusted.packages:*

  # 注意错误排查2,因kafka会自动对消息队列中的历史消息进行反序列化,如果消息队列历史有乱消息,建议新建topic,以保证队列中的消息全为合法的可反序列化的数据

消息接收代码-推模型

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

import com.wdh.tacocloud_kitchen.KitchenUI;
import com.wdh.tacocloud.domain.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Component;


/**
 * @author WangDH
 * @create 2022-09-29 17:09
 */
@Slf4j
@Component
public class OrderListener {
    private KitchenUI kitchenUI;

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

    //方式1
//    @KafkaListener(topics="quickstart-events")
//    public void handle(Order order){
//        kitchenUI.displayOrder(order);
//    }

    //方式2
    @KafkaListener(topics="wdhtacocloud-events")//"quickstart-events") //注意:本程序启动前,需要手动通过kafka手工创建名为【wdhtacocloud-events】的topic,且不要乱写数据以防止反序列化失败
    public void handle(Order order, Message<Order> message){

        MessageHeaders headers=message.getHeaders();
        log.info("OrderListener Receive from partition {} with timestamp {}",
                headers.get(KafkaHeaders.RECEIVED_PARTITION_ID),
                headers.get(KafkaHeaders.RECEIVED_TIMESTAMP)
                );

        kitchenUI.displayOrder(order);

    }

}

测试消息发送与接收

1.保证zookeeper和kafka正在运行中,通过windows cmd窗口创建一个topic,并且不用往topic里推送数据。

cmd kafka创建topic(示例主题名为wdhtacocloud-events),细节不赘述

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

D:\JavaDevEnv\kafka_2.13-3.2.3>.\bin\windows\kafka-topics.bat --create --topic wdhtacocloud-events --bootstrap-server localhost:9092
Created topic quickstart-events.

D:\JavaDevEnv\kafka_2.13-3.2.3>

2.启动发送端springboot程序TacocloudApplication(端口8090)

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=6258: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_kafka\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\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\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\kafka\spring-kafka\2.5.10.RELEASE\spring-kafka-2.5.10.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-messaging\5.2.12.RELEASE\spring-messaging-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\retry\spring-retry\1.2.5.RELEASE\spring-retry-1.2.5.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\apache\kafka\kafka-clients\2.5.1\kafka-clients-2.5.1.jar;D:\JavaDevEnv\maven_repository\com\github\luben\zstd-jni\1.4.4-7\zstd-jni-1.4.4-7.jar;D:\JavaDevEnv\maven_repository\org\lz4\lz4-java\1.7.1\lz4-java-1.7.1.jar;D:\JavaDevEnv\maven_repository\org\xerial\snappy\snappy-java\1.1.7.3\snappy-java-1.1.7.3.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 15:45:08.088  INFO 4292 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : Starting TacocloudApplication on 14JPYI7CBESDNFK with PID 4292 (D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_kafka\tacocloud\target\classes started by Administrator in D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_kafka)
2022-09-30 15:45:08.091  INFO 4292 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : No active profile set, falling back to default profiles: default
2022-09-30 15:45:08.138  INFO 4292 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2022-09-30 15:45:08.138  INFO 4292 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2022-09-30 15:45:09.542  INFO 4292 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8090 (http)
2022-09-30 15:45:09.550  INFO 4292 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-09-30 15:45:09.551  INFO 4292 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2022-09-30 15:45:09.612  INFO 4292 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-09-30 15:45:09.613  INFO 4292 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1474 ms
2022-09-30 15:45:10.498  INFO 4292 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-09-30 15:45:10.897  INFO 4292 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: 30069a17-5b95-4214-be96-e9b902958a22

2022-09-30 15:45:11.081  INFO 4292 --- [  restartedMain] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@b0c1ab7, org.springframework.security.web.context.SecurityContextPersistenceFilter@79c4c3c3, org.springframework.security.web.header.HeaderWriterFilter@73900d00, org.springframework.security.web.csrf.CsrfFilter@4238e65c, org.springframework.security.web.authentication.logout.LogoutFilter@5860fbc4, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@42f01e09, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6145b16d, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@44e072da, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@569bb6b1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6fb1983c, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@529c50b, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1d7fee86, org.springframework.security.web.session.SessionManagementFilter@437c38fc, org.springframework.security.web.access.ExceptionTranslationFilter@2bd26abf, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@75044ac5]
2022-09-30 15:45:11.154  INFO 4292 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2022-09-30 15:45:11.188  INFO 4292 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 (http) with context path ''
2022-09-30 15:45:11.198  INFO 4292 --- [  restartedMain] com.wdh.tacocloud.TacocloudApplication   : Started TacocloudApplication in 3.562 seconds (JVM running for 4.255)

因引入了Spring Security,所有控制台打印的user的密码为

2022-09-30 15:45:10.897  INFO 4292 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: 30069a17-5b95-4214-be96-e9b902958a22

  

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=6276: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_kafka\tacocloud_kitchen_kafka\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-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\kafka\spring-kafka\2.5.10.RELEASE\spring-kafka-2.5.10.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-messaging\5.2.12.RELEASE\spring-messaging-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\retry\spring-retry\1.2.5.RELEASE\spring-retry-1.2.5.RELEASE.jar;D:\JavaDevEnv\maven_repository\org\apache\kafka\kafka-clients\2.5.1\kafka-clients-2.5.1.jar;D:\JavaDevEnv\maven_repository\com\github\luben\zstd-jni\1.4.4-7\zstd-jni-1.4.4-7.jar;D:\JavaDevEnv\maven_repository\org\lz4\lz4-java\1.7.1\lz4-java-1.7.1.jar;D:\JavaDevEnv\maven_repository\org\xerial\snappy\snappy-java\1.1.7.3\snappy-java-1.1.7.3.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_kafka\tacocloud\target\classes" com.wdh.tacocloud_kitchen.TacocloudKitchenApplication

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

2022-09-30 15:45:45.536  INFO 5712 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : Starting TacocloudKitchenApplication on 14JPYI7CBESDNFK with PID 5712 (D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_kafka\tacocloud_kitchen_kafka\target\classes started by Administrator in D:\JavaWorkspace\IdeaProjects\SpringInAction\ch08_kafka)
2022-09-30 15:45:45.540  INFO 5712 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : No active profile set, falling back to default profiles: default
2022-09-30 15:45:45.591  INFO 5712 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2022-09-30 15:45:45.591  INFO 5712 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2022-09-30 15:45:46.575  INFO 5712 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
2022-09-30 15:45:46.583  INFO 5712 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-09-30 15:45:46.584  INFO 5712 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2022-09-30 15:45:46.648  INFO 5712 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-09-30 15:45:46.648  INFO 5712 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1057 ms
2022-09-30 15:45:46.819  INFO 5712 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-09-30 15:45:46.930  WARN 5712 --- [  restartedMain] org.thymeleaf.templatemode.TemplateMode  : [THYMELEAF][restartedMain] Template Mode 'HTML5' is deprecated. Using Template Mode 'HTML' instead.
2022-09-30 15:45:47.046  WARN 5712 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : Unable to start LiveReload server
2022-09-30 15:45:47.098  INFO 5712 --- [  restartedMain] o.a.k.clients.consumer.ConsumerConfig    : ConsumerConfig values: 
	allow.auto.create.topics = true
	auto.commit.interval.ms = 5000
	auto.offset.reset = latest
	bootstrap.servers = [localhost:9092]
	check.crcs = true
	client.dns.lookup = default
	client.id = 
	client.rack = 
	connections.max.idle.ms = 540000
	default.api.timeout.ms = 60000
	enable.auto.commit = false
	exclude.internal.topics = true
	fetch.max.bytes = 52428800
	fetch.max.wait.ms = 500
	fetch.min.bytes = 1
	group.id = tacocloud_kitchen
	group.instance.id = null
	heartbeat.interval.ms = 3000
	interceptor.classes = []
	internal.leave.group.on.close = true
	isolation.level = read_uncommitted
	key.deserializer = class org.springframework.kafka.support.serializer.JsonDeserializer
	max.partition.fetch.bytes = 1048576
	max.poll.interval.ms = 300000
	max.poll.records = 500
	metadata.max.age.ms = 300000
	metric.reporters = []
	metrics.num.samples = 2
	metrics.recording.level = INFO
	metrics.sample.window.ms = 30000
	partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor]
	receive.buffer.bytes = 65536
	reconnect.backoff.max.ms = 1000
	reconnect.backoff.ms = 50
	request.timeout.ms = 30000
	retry.backoff.ms = 100
	sasl.client.callback.handler.class = null
	sasl.jaas.config = null
	sasl.kerberos.kinit.cmd = /usr/bin/kinit
	sasl.kerberos.min.time.before.relogin = 60000
	sasl.kerberos.service.name = null
	sasl.kerberos.ticket.renew.jitter = 0.05
	sasl.kerberos.ticket.renew.window.factor = 0.8
	sasl.login.callback.handler.class = null
	sasl.login.class = null
	sasl.login.refresh.buffer.seconds = 300
	sasl.login.refresh.min.period.seconds = 60
	sasl.login.refresh.window.factor = 0.8
	sasl.login.refresh.window.jitter = 0.05
	sasl.mechanism = GSSAPI
	security.protocol = PLAINTEXT
	security.providers = null
	send.buffer.bytes = 131072
	session.timeout.ms = 10000
	ssl.cipher.suites = null
	ssl.enabled.protocols = [TLSv1.2]
	ssl.endpoint.identification.algorithm = https
	ssl.key.password = null
	ssl.keymanager.algorithm = SunX509
	ssl.keystore.location = null
	ssl.keystore.password = null
	ssl.keystore.type = JKS
	ssl.protocol = TLSv1.2
	ssl.provider = null
	ssl.secure.random.implementation = null
	ssl.trustmanager.algorithm = PKIX
	ssl.truststore.location = null
	ssl.truststore.password = null
	ssl.truststore.type = JKS
	value.deserializer = class org.springframework.kafka.support.serializer.JsonDeserializer

2022-09-30 15:45:47.153  INFO 5712 --- [  restartedMain] o.a.kafka.common.utils.AppInfoParser     : Kafka version: 2.5.1
2022-09-30 15:45:47.153  INFO 5712 --- [  restartedMain] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId: 0efa8fb0f4c73d92
2022-09-30 15:45:47.153  INFO 5712 --- [  restartedMain] o.a.kafka.common.utils.AppInfoParser     : Kafka startTimeMs: 1664523947152
2022-09-30 15:45:47.155  INFO 5712 --- [  restartedMain] o.a.k.clients.consumer.KafkaConsumer     : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Subscribed to topic(s): wdhtacocloud-events
2022-09-30 15:45:47.157  INFO 5712 --- [  restartedMain] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService
2022-09-30 15:45:47.174  INFO 5712 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2022-09-30 15:45:47.183  INFO 5712 --- [  restartedMain] c.w.t.TacocloudKitchenApplication        : Started TacocloudKitchenApplication in 2.012 seconds (JVM running for 2.658)
2022-09-30 15:45:47.396  INFO 5712 --- [ntainer#0-0-C-1] org.apache.kafka.clients.Metadata        : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Cluster ID: nIA89HDbRKqR88ZJ-aUlHA
2022-09-30 15:45:47.396  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Discovered group coordinator 14JPYI7CBESDNFK:9092 (id: 2147483647 rack: null)
2022-09-30 15:45:47.396  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] (Re-)joining group
2022-09-30 15:45:47.411  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Join group failed with org.apache.kafka.common.errors.MemberIdRequiredException: The group member needs to have a valid member id before actually entering a consumer group
2022-09-30 15:45:47.411  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] (Re-)joining group
2022-09-30 15:45:47.411  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Finished assignment for group at generation 19: {consumer-tacocloud_kitchen-1-c66ce8ef-8c01-494b-8cea-9f55f310241e=Assignment(partitions=[wdhtacocloud-events-0])}
2022-09-30 15:45:47.411  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Successfully joined group with generation 19
2022-09-30 15:45:47.427  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Adding newly assigned partitions: wdhtacocloud-events-0
2022-09-30 15:45:47.427  INFO 5712 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator  : [Consumer clientId=consumer-tacocloud_kitchen-1, groupId=tacocloud_kitchen] Setting offset for partition wdhtacocloud-events-0 to the committed offset FetchPosition{offset=5, offsetEpoch=Optional.empty, currentLeader=LeaderAndEpoch{leader=Optional[14JPYI7CBESDNFK:9092 (id: 0 rack: null)], epoch=0}}
2022-09-30 15:45:47.427  INFO 5712 --- [ntainer#0-0-C-1] o.s.k.l.KafkaMessageListenerContainer    : tacocloud_kitchen: partitions assigned: [wdhtacocloud-events-0]

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

  

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

 

其他-关于IDEA中一个Project项目内包含多个子工程及添加单向依赖的办法

1.IDEA中Create Project时先创建Empty Project

2.打开Empty Project后点击New-Module.../Module from existing source,可以将子工程以Module的形式添加到该Project中

3.B子工程依赖于A子工程的包(例如domain包),可从IDEA-File-Project Structure-Project Settings-Modules,选中B工程,在右侧点击+号图标添加3.Module dependency,选中A子工程,下图就是为tacocloud_kitchen_kafka工程添加对tacocloud工程的依赖。

  

4.调试时在Run Dashboard中可点击切换查看两个工程的日志输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值