• kafka笔记地址:https://blog.csdn.net/hancoder/article/details/107446151
  • 笔记、代码下载地址:https://me.csdn.net/download/hancoder
  • 黑马kafka笔记下载地址:https://download.csdn.net/download/hancoder/12638762
  • 黑马视频地址(又名kafka探秘者):https://www.bilibili.com/video/BV1oK4y1x75C
  • 慕课网视频:Kafka多维度系统精讲,从入门到熟练掌握(可以取吾爱破解网找资源)
  • 慕课网的视频笔记地址:https://blog.csdn.net/hancoder/article/details/108553335

    文章目录

    • 1、 调查问卷查询模板接口:
            • 响应结果演示:
    • 2、 调查问卷结果查询接口:
    • 3、 调查问卷结果统计接口:
            • 响应结果演示:
        • controller
            • WechatTemplateController
        • Service
            • WechatTemplateServiceImpl
            • WechatTemplateService
        • Utils
            • FileUtils
        • conf
            • KafkaConf
            • KafkaProperties
            • WechatTemplateProperties
        • common
            • BaseResponseVO
            • CorsFilter
        • main
          • logback.xml
          • application.yml
          • template.json
          • templateResult.json
        • pom.xml
        • admin
        • producer
        • stream
        • consumer
            • ConsumerSample

1、 调查问卷查询模板接口:

功能:

接口 URL:/v1/template

接口请求方式:GET

请求参数:

请求参数参数类型是否必填默认值参数描述

请求参数实例:无

响应结果:

请求参数参数类型参数描述
requestIdstring单次请求唯一标识
resultobject返回结果

result:问卷模板:由多个问题组成

请求参数参数类型参数描述
templateIdstring调查问卷模板编号
templatearray调查问卷模板内容

template:即问题

请求参数参数类型参数描述
questionIdstring调查问卷模板编号
questionstring调查问卷模板内容
optionsarray调查问卷选项
响应结果演示:
{"requestId": "", "result": {"templateId": "001","template": [{"questionId": "1","question": "今天几号","answer": "", "options": [{"label": "1 号", "value": "A"},{"label": "2 号", "value": "B"},{"label": "3 号", "value": "C"},{"label": "4 号", "value": "D"}]},{"questionId": "2", "question": "你喜爱的颜色", "answer": "","options": [{"label": "红色", "value": "A"},{"label": "黄色", "value": "B"},{"label": "绿色", "value": "C"},{"label": "紫色", "value": "D"}]}]}
}

2、 调查问卷结果查询接口:

接口 URL:/v1/template/report

接口请求方式: POST

请求参数:

请求参数参数类型是否必填默认值参数描述
templateIdstring模板编号
resultarray调查问卷结果

result:

请求参数参数类型是否必填默认值参数描述
questionIdstring问题编号
questionstring问题内容
answerstring问题所选答案

请求参数实例:

{templateId:"001", result:[{"questionId":"1","question":"今天几号","answer":"A"},{"questionId":"2","question":"你喜爱的颜色","answer":"B"}]
}

响应结果:

请求参数参数类型参数描述
requestIdstring单次请求唯一标识

响应结果演示:

{
"requestId":""
}

3、 调查问卷结果统计接口:

接口 URL:/v1/template/result接口请求方式: GET

请求参数:

请求参数参数类型是否必填默认值参数描述
templateIdstring模板编号

请求参数实例:

{templateId:"001"  //非必填
}

响应结果:

请求参数参数类型参数描述
requestIdstring单次请求唯一标识
resultobject请求返回结果

result:

请求参数参数类型参数描述
templateIdstring单次请求唯一标识
totalNumberstring请求返回结果
statisticsarray统计结果

statistics:

请求参数参数类型参数描述
questionIdstring问题编号
questionstring问题描述
answersarray答案结果统计
响应结果演示:
{"requestId":"","result":{ "templateId": "001","totalNumber": "102", "statistics": [{"questionId": "1","question": "今天几号", "answers": [{"label": "A", "value": 10},{"label": "B", "value": 50},{"label": "C", "value": 12},{"label": "D", "value": 17}]},{"questionId": "2", "question": "你喜爱的颜色", "answers": [{"label": "A", "value": 12},{"label": "B", "value": 52},{"label": "C", "value": 17},{"label": "D", "value": 17}]}]}
}

controller

WechatTemplateController
package com.imooc.jiangzh.kafka.wechat.controller;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.imooc.jiangzh.kafka.wechat.common.BaseResponseVO;
import com.imooc.jiangzh.kafka.wechat.conf.WechatTemplateProperties;
import com.imooc.jiangzh.kafka.wechat.service.WechatTemplateService;
import com.imooc.jiangzh.kafka.wechat.utils.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.Map;@RestController
@RequestMapping(value = "/v1")
public class WechatTemplateController {@Autowiredprivate WechatTemplateProperties properties;@Autowiredprivate WechatTemplateService wechatTemplateService;// 获取问题@RequestMapping(value = "/template", method = RequestMethod.GET)public BaseResponseVO getTemplate(){WechatTemplateProperties.WechatTemplate wechatTemplate = wechatTemplateService.getWechatTemplate();Map<String, Object> result = Maps.newHashMap();result.put("templateId",wechatTemplate.getTemplateId());result.put("template", FileUtils.readFile2JsonArray(wechatTemplate.getTemplateFilePath()));return BaseResponseVO.success(result);}// 展示结果@RequestMapping(value = "/template/result", method = RequestMethod.GET)public BaseResponseVO templateStatistics(@RequestParam(value = "templateId", required = false)String templateId){JSONObject statistics = wechatTemplateService.templateStatistics(templateId);return BaseResponseVO.success(statistics);}// 提交回答@RequestMapping(value = "/template/report", method = RequestMethod.POST)public BaseResponseVO dataReported(@RequestBody String reportData){wechatTemplateService.templateReported(JSON.parseObject(reportData));return BaseResponseVO.success();}
}

Service

WechatTemplateServiceImpl
package com.imooc.jiangzh.kafka.wechat.service;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.imooc.jiangzh.kafka.wechat.conf.WechatTemplateProperties;
import com.imooc.jiangzh.kafka.wechat.utils.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;
import java.util.concurrent.Future;@Slf4j
@Service
public class WechatTemplateServiceImpl implements WechatTemplateService{@Autowiredprivate WechatTemplateProperties properties;@Autowiredprivate Producer producer;@Override// 获取微信调查问卷模板 - 获取目前active为true的模板就可以了public WechatTemplateProperties.WechatTemplate getWechatTemplate() {List<WechatTemplateProperties.WechatTemplate> templates = properties.getTemplates();// 过滤为Active的Optional<WechatTemplateProperties.WechatTemplate> wechatTemplate= templates.stream().filter((template) -> template.isActive()).//过滤剩下active为true的findFirst();return wechatTemplate.isPresent() ? wechatTemplate.get() : null;}@Override// 上报调查问卷填写结果public void templateReported(JSONObject reportInfo) {// kafka producer将数据推送至Kafka Topiclog.info("templateReported : [{}]", reportInfo);String topicName = "jiangzh-topic";// 发送Kafka数据String templateId = reportInfo.getString("templateId");JSONArray reportData = reportInfo.getJSONArray("result");//回答// 如果templateid相同,后续在统计分析时,可以考虑将相同的id的内容放入同一个partition,便于分析使用ProducerRecord<String,Object> record =new ProducerRecord<>(topicName,templateId,reportData);/*1、Kafka Producer是线程安全的,建议多线程复用,如果每个线程都创建,出现大量的上下文切换或争抢的情况,影响Kafka效率2、Kafka Producer的key是一个很重要的内容:2.1 我们可以根据Key完成Partition的负载均衡2.2 合理的Key设计,可以让Flink、Spark Streaming之类的实时分析工具做更快速处理3、ack - all, kafka层面上就已经有了只有一次的消息投递保障,但是如果想真的不丢数据,最好自行处理异常*/try{producer.send(record);}catch (Exception e){// 将数据加入重发队列, redis,es,...}}@Override// 获取调查问卷的统计结果public JSONObject templateStatistics(String templateId) {// 判断数据结果获取类型if(properties.getTemplateResultType() == 0){ // 文件获取return FileUtils.readFile2JsonObject(properties.getTemplateResultFilePath()).get();}else{// DB ..}return null;}
}
WechatTemplateService
package com.imooc.jiangzh.kafka.wechat.service;import com.alibaba.fastjson.JSONObject;
import com.imooc.jiangzh.kafka.wechat.conf.WechatTemplateProperties;public interface WechatTemplateService {// 获取微信调查问卷模板 - 获取目前active为true的模板就可以了WechatTemplateProperties.WechatTemplate getWechatTemplate();// 上报调查问卷填写结果void templateReported(JSONObject reportInfo);// 获取调查问卷的统计结果JSONObject templateStatistics(String templateId);}

Utils

FileUtils
package com.imooc.jiangzh.kafka.wechat.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Optional;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;/*** @author : jiangzh* @description : 文件工具类**/
@Slf4j
public class FileUtils {// 传一个文件路径,然后转成字符串返回public static String readFile(String filePath) throws IOException {@Cleanup//lombok标签,使我们不用写try catch和closeBufferedReader reader = new BufferedReader(new FileReader(new File(filePath)));String lineStr = "";StringBuffer stringBuffer = new StringBuffer();while ((lineStr = reader.readLine()) != null) {stringBuffer.append(lineStr);}return stringBuffer.toString();}// 把文件内容转成jsonpublic static Optional<JSONObject> readFile2JsonObject(String filePath){try {String fileContent = readFile(filePath);//上面的函数log.info("readFile2Json fileContent: [{}]" , fileContent);// JSON.parseObject(fileContent)把上面的字符串转成jsonreturn Optional.ofNullable(JSON.parseObject(fileContent));//java.util.Optional;} catch (IOException e) {e.printStackTrace();}return Optional.empty();}// 转成json数组public static Optional<JSONArray> readFile2JsonArray(String filePath){try {String fileContent = readFile(filePath);log.info("readFile2JsonArray fileContent: [{}]" , fileContent);return Optional.ofNullable(JSON.parseArray(fileContent));} catch (IOException e) {e.printStackTrace();}return Optional.empty();}}

conf

KafkaConf
package com.imooc.jiangzh.kafka.wechat.conf;import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Properties;@Configuration
public class KafkaConf {@Autowiredprivate KafkaProperties kafkaProperties;@Beanpublic Producer kafkaProducer(){Properties properties = new Properties();properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getBootstrapServers());properties.put(ProducerConfig.ACKS_CONFIG, kafkaProperties.getAcksConfig());properties.put(ProducerConfig.RETRIES_CONFIG,"0");properties.put(ProducerConfig.BATCH_SIZE_CONFIG,"16384");properties.put(ProducerConfig.LINGER_MS_CONFIG,"1");properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG,"33554432");properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
//        properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.imooc.jiangzh.kafka.producer.SamplePartition");// Producer的主对象Producer<String,String> producer = new KafkaProducer<>(properties);return producer;}}
KafkaProperties
package com.imooc.jiangzh.kafka.wechat.conf;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;@Data
@Configuration
@ConfigurationProperties(prefix = "wechat.kafka")//解析application.yml中的前缀内容
public class KafkaProperties {private String bootstrapServers;private String acksConfig;private String partitionerClass;}
WechatTemplateProperties

绑定application.yml中的配置,他的作用主要是告诉是哪个问题模板、问卷的汇总结果在哪里

package com.imooc.jiangzh.kafka.wechat.conf;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;import java.util.List;@Data
@Configuration
@ConfigurationProperties(prefix = "template")
public class WechatTemplateProperties {private List<WechatTemplate> templates;///template.json","active": true}private int templateResultType; // 0-文件获取 1-数据库获取 2-ESprivate String templateResultFilePath;//templateResult.json"@Data // getter setterpublic static class WechatTemplate{private String templateId;//模板编号private String templateFilePath;private boolean active;}
}

common

BaseResponseVO
package com.imooc.jiangzh.kafka.wechat.common;import java.util.UUID;
import lombok.Data;/* 公共返回对象 **/
@Data
public class BaseResponseVO<M> {private String requestId;private M result;// 只设置idpublic static<M> BaseResponseVO success(){BaseResponseVO baseResponseVO = new BaseResponseVO();baseResponseVO.setRequestId(genRequestId());return baseResponseVO;}// 设置id和resultpublic static<M> BaseResponseVO success(M result){BaseResponseVO baseResponseVO = new BaseResponseVO();baseResponseVO.setRequestId(genRequestId());baseResponseVO.setResult(result);return baseResponseVO;}private static String genRequestId(){return UUID.randomUUID().toString();}
}
CorsFilter
package com.imooc.jiangzh.kafka.wechat.common;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;/*** @author : jiangzh* @description : 跨域问题解决**/
@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");chain.doFilter(req, res);}
}

main

package com.imooc.jiangzh.kafka;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class KafkaStudyApplication {public static void main(String[] args) {SpringApplication.run(KafkaStudyApplication.class, args);}}

logback.xml

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%highlight(%-5level) (%file:%line\)- %m%n</pattern><charset>UTF-8</charset></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

application.yml

server:port: 443ssl:key-store: 3702162_wechat.coding-jiangzh.com.pfxkey-store-password: 49Jk65Pitemplate:templates:- {"templateId":"1","templateFilePath":"F:/workSpace/mooc_workspace/kafka_study/src/main/resources/template/template.json","active": true}- {"templateId":"2","templateFilePath":"F:/workSpace/mooc_workspace/kafka_study/src/main/resources/template/template.json","active": false}template-result-type: 0  # 0-文件获取 1-数据库获取 2-EStemplate-result-file-path: "F:/workSpace/mooc_workspace/kafka_study/src/main/resources/template/templateResult.json"wechat:kafka:bootstrap_servers: "192.168.220.128:9092"acks_config: "all"partitioner_class: "com.imooc.jiangzh.kafka.producer.SamplePartition"logging:config: classpath:logback.xml

template.json

问题模板

[{"questionId": "1","question": "今天几号","answer": "","options": [{"label": "1号", "value": "A"},{"label": "2号", "value": "B"},{"label": "3号", "value": "C"},{"label": "4号", "value": "D"}]},{"questionId": "2","question": "你喜爱的颜色","answer": "","options": [{"label": "红色", "value": "A"},{"label": "黄色", "value": "B"},{"label": "绿色", "value": "C"},{"label": "紫色", "value": "D"}]}
]

templateResult.json

调查结果

{"templateId": "001","totalNumber": "102",#多少人作答"statistics": [{"questionId": "1","question": "今天几号","answers": [{"label": "A", "value": 10},#A选项有10{"label": "B", "value": 50},{"label": "C", "value": 12},{"label": "D", "value": 17}]},{"questionId": "2","question": "你喜爱的颜色","answers": [{"label": "A", "value": 12},{"label": "B", "value": 52},{"label": "C", "value": 17},{"label": "D", "value": 17}]}]
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.imooc.jiangzh</groupId><artifactId>kafka-study</artifactId><version>0.0.1-SNAPSHOT</version><name>kafka-study</name><description>慕课网学习Kafka使用</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.0</version></dependency><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><version>2.4.0</version></dependency><dependency><!--idea里也要安装lombok插件--><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.2-jre</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.68</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

admin

package com.imooc.jiangzh.kafka.admin;import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.KafkaFuture;
import org.apache.kafka.common.config.ConfigResource;
import org.apache.kafka.common.internals.Topic;
import org.apache.kafka.server.quota.ClientQuotaEntity;import java.util.*;
import java.util.concurrent.ExecutionException;public class AdminSample {public final static String TOPIC_NAME="jiangzh-topic";public static void main(String[] args) throws Exception {
//        AdminClient adminClient = AdminSample.adminClient();
//        System.out.println("adminClient : "+ adminClient);// 创建Topic实例
//        createTopic();// 删除Topic实例
//        delTopics();// 获取Topic列表
//        topicLists();// 描述TopicdescribeTopics();// 修改Config
//        alterConfig();// 查询Config
//        describeConfig();// 增加partition数量
//        incrPartitions(2);}/*增加partition数量*/public static void incrPartitions(int partitions) throws Exception{AdminClient adminClient = adminClient();Map<String, NewPartitions> partitionsMap = new HashMap<>();NewPartitions newPartitions = NewPartitions.increaseTo(partitions);partitionsMap.put(TOPIC_NAME, newPartitions);CreatePartitionsResult createPartitionsResult = adminClient.createPartitions(partitionsMap);createPartitionsResult.all().get();}/*修改Config信息*/public static void alterConfig() throws Exception{AdminClient adminClient = adminClient();
//        Map<ConfigResource,Config> configMaps = new HashMap<>();
//
//        // 组织两个参数
//        ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, TOPIC_NAME);
//        Config config = new Config(Arrays.asList(new ConfigEntry("preallocate","true")));
//        configMaps.put(configResource,config);
//        AlterConfigsResult alterConfigsResult = adminClient.alterConfigs(configMaps);/*从 2.3以上的版本新修改的API*/Map<ConfigResource,Collection<AlterConfigOp>> configMaps = new HashMap<>();// 组织两个参数ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, TOPIC_NAME);AlterConfigOp alterConfigOp =new AlterConfigOp(new ConfigEntry("preallocate","false"),AlterConfigOp.OpType.SET);configMaps.put(configResource,Arrays.asList(alterConfigOp));AlterConfigsResult alterConfigsResult = adminClient.incrementalAlterConfigs(configMaps);alterConfigsResult.all().get();}/*查看配置信息ConfigResource(type=TOPIC, name='jiangzh-topic') ,Config(entries=[ConfigEntry(name=compression.type,value=producer,source=DEFAULT_CONFIG,isSensitive=false,isReadOnly=false,synonyms=[]),ConfigEntry(name=leader.replication.throttled.replicas,value=,source=DEFAULT_CONFIG,isSensitive=false,isReadOnly=false,synonyms=[]), ConfigEntry(name=message.downconversion.enable, value=true, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.insync.replicas, value=1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.jitter.ms, value=0, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=cleanup.policy, value=delete, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=flush.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=follower.replication.throttled.replicas, value=, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.bytes, value=1073741824, source=STATIC_BROKER_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=retention.ms, value=604800000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=flush.messages, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.format.version, value=2.4-IV1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=file.delete.delay.ms, value=60000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=max.compaction.lag.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=max.message.bytes, value=1000012, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.compaction.lag.ms, value=0, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.timestamp.type, value=CreateTime, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]),ConfigEntry(name=preallocate, value=false, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.cleanable.dirty.ratio, value=0.5, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=index.interval.bytes, value=4096, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=unclean.leader.election.enable, value=false, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=retention.bytes, value=-1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=delete.retention.ms, value=86400000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.ms, value=604800000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.timestamp.difference.max.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.index.bytes, value=10485760, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[])])*/public static void describeConfig() throws Exception{AdminClient adminClient = adminClient();// TODO 这里做一个预留,集群时会讲到
//        ConfigResource configResource = new ConfigResource(ConfigResource.Type.BROKER, TOPIC_NAME);ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, TOPIC_NAME);DescribeConfigsResult describeConfigsResult = adminClient.describeConfigs(Arrays.asList(configResource));Map<ConfigResource, Config> configResourceConfigMap = describeConfigsResult.all().get();configResourceConfigMap.entrySet().stream().forEach((entry)->{System.out.println("configResource : "+entry.getKey()+" , Config : "+entry.getValue());});}/*描述Topicname :jiangzh-topic ,desc: (name=jiangzh-topic,internal=false,partitions=(partition=0,leader=192.168.220.128:9092(id: 0 rack: null),replicas=192.168.220.128:9092(id: 0 rack: null),isr=192.168.220.128:9092(id: 0 rack: null)),authorizedOperations=[])*/public static void describeTopics() throws Exception {AdminClient adminClient = adminClient();DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(Arrays.asList(TOPIC_NAME));Map<String, TopicDescription> stringTopicDescriptionMap = describeTopicsResult.all().get();Set<Map.Entry<String, TopicDescription>> entries = stringTopicDescriptionMap.entrySet();entries.stream().forEach((entry)->{System.out.println("name :"+entry.getKey()+" , desc: "+ entry.getValue());});}/*删除Topic*/public static void delTopics() throws Exception {AdminClient adminClient = adminClient();DeleteTopicsResult deleteTopicsResult = adminClient.deleteTopics(Arrays.asList(TOPIC_NAME));deleteTopicsResult.all().get();}/*获取Topic列表*/public static void topicLists() throws Exception {AdminClient adminClient = adminClient();// 是否查看internal选项ListTopicsOptions options = new ListTopicsOptions();options.listInternal(true);
//        ListTopicsResult listTopicsResult = adminClient.listTopics();ListTopicsResult listTopicsResult = adminClient.listTopics(options);Set<String> names = listTopicsResult.names().get();Collection<TopicListing> topicListings = listTopicsResult.listings().get();KafkaFuture<Map<String, TopicListing>> mapKafkaFuture = listTopicsResult.namesToListings();// 打印namesnames.stream().forEach(System.out::println);// 打印topicListingstopicListings.stream().forEach((topicList)->{System.out.println(topicList);});}/*创建Topic实例*/public static void createTopic() {AdminClient adminClient = adminClient();// 副本因子Short rs = 1;NewTopic newTopic = new NewTopic(TOPIC_NAME, 1 , rs);CreateTopicsResult topics = adminClient.createTopics(Arrays.asList(newTopic));System.out.println("CreateTopicsResult : "+ topics);}/*设置AdminClient*/public static AdminClient adminClient(){Properties properties = new Properties();properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.220.128:9092");AdminClient adminClient = AdminClient.create(properties);return adminClient;}}

producer

package com.imooc.jiangzh.kafka.producer;import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;import java.util.Map;public class SamplePartition implements Partitioner {@Overridepublic int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {/*key-1key-2key-3*/String keyStr = key + "";String keyInt = keyStr.substring(4);System.out.println("keyStr : "+keyStr + "keyInt : "+keyInt);int i = Integer.parseInt(keyInt);return i%2;}@Overridepublic void close() {}@Overridepublic void configure(Map<String, ?> configs) {}
}

stream

package com.imooc.jiangzh.kafka.stream;import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.Produced;import java.util.Arrays;
import java.util.Locale;
import java.util.Properties;public class StreamSample {private static final String INPUT_TOPIC="jiangzh-stream-in";private static final String OUT_TOPIC="jiangzh-stream-out";public static void main(String[] args) {Properties props = new Properties();props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.220.128:9092");props.put(StreamsConfig.APPLICATION_ID_CONFIG,"wordcount-app");props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());// 如果构建流结构拓扑final StreamsBuilder builder = new StreamsBuilder();// 构建Wordcount
//        wordcountStream(builder);// 构建foreachStreamforeachStream(builder);final KafkaStreams streams = new KafkaStreams(builder.build(), props);streams.start();}// 如果定义流计算过程static void foreachStream(final StreamsBuilder builder){KStream<String,String> source = builder.stream(INPUT_TOPIC);source.flatMapValues(value -> Arrays.asList(value.toLowerCase(Locale.getDefault()).split(" "))).foreach((key,value)-> System.out.println(key + " : " + value));}// 如果定义流计算过程static void wordcountStream(final StreamsBuilder builder){// 不断从INPUT_TOPIC上获取新数据,并且追加到流上的一个抽象对象KStream<String,String> source = builder.stream(INPUT_TOPIC);// Hello World imooc// KTable是数据集合的抽象对象// 算子final KTable<String, Long> count =source// flatMapValues -> 将一行数据拆分为多行数据  key 1 , value Hello World// flatMapValues -> 将一行数据拆分为多行数据  key 1 , value Hello key xx , value World/*key 1 , value Hello   -> Hello 1  World 2key 2 , value Worldkey 3 , value World*/.flatMapValues(value -> Arrays.asList(value.toLowerCase(Locale.getDefault()).split(" ")))// 合并 -> 按value值合并.groupBy((key, value) -> value)// 统计出现的总数.count();// 将结果输入到OUT_TOPIC中count.toStream().to(OUT_TOPIC, Produced.with(Serdes.String(),Serdes.Long()));}}

consumer

ConsumerSample
package com.imooc.jiangzh.kafka.consumer;import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.OffsetAndMetadata;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.internals.Topic;import java.time.Duration;
import java.util.*;public class ConsumerSample {private final static String TOPIC_NAME="jiangzh-topic";public static void main(String[] args) {
//        helloworld();// 手动提交offset
//        commitedOffset();// 手动对每个Partition进行提交
//        commitedOffsetWithPartition();// 手动订阅某个或某些分区,并提交offset
//        commitedOffsetWithPartition2();// 手动指定offset的起始位置,及手动提交offset
//        controlOffset();// 流量控制controlPause();}/*工作里这种用法,有,但是不推荐*/private static void helloworld(){Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "true");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String,String> consumer = new KafkaConsumer(props);// 消费订阅哪一个Topic或者几个Topicconsumer.subscribe(Arrays.asList(TOPIC_NAME));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));for (ConsumerRecord<String, String> record : records)System.out.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(),record.offset(), record.key(), record.value());}}/*手动提交offset*/private static void commitedOffset() {Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "false");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer(props);// 消费订阅哪一个Topic或者几个Topicconsumer.subscribe(Arrays.asList(TOPIC_NAME));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));for (ConsumerRecord<String, String> record : records) {// 想把数据保存到数据库,成功就成功,不成功...// TODO record 2 dbSystem.out.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());// 如果失败,则回滚, 不要提交offset}// 如果成功,手动通知offset提交consumer.commitAsync();}}/*手动提交offset,并且手动控制partition*/private static void commitedOffsetWithPartition() {Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "false");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer(props);// 消费订阅哪一个Topic或者几个Topicconsumer.subscribe(Arrays.asList(TOPIC_NAME));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));// 每个partition单独处理for(TopicPartition partition : records.partitions()){List<ConsumerRecord<String, String>> pRecord = records.records(partition);for (ConsumerRecord<String, String> record : pRecord) {System.out.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());}long lastOffset = pRecord.get(pRecord.size() -1).offset();// 单个partition中的offset,并且进行提交Map<TopicPartition, OffsetAndMetadata> offset = new HashMap<>();offset.put(partition,new OffsetAndMetadata(lastOffset+1));// 提交offsetconsumer.commitSync(offset);System.out.println("=============partition - "+ partition +" end================");}}}/*手动提交offset,并且手动控制partition,更高级*/private static void commitedOffsetWithPartition2() {Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "false");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer(props);// jiangzh-topic - 0,1两个partitionTopicPartition p0 = new TopicPartition(TOPIC_NAME, 0);TopicPartition p1 = new TopicPartition(TOPIC_NAME, 1);// 消费订阅哪一个Topic或者几个Topic
//        consumer.subscribe(Arrays.asList(TOPIC_NAME));// 消费订阅某个Topic的某个分区consumer.assign(Arrays.asList(p0));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));// 每个partition单独处理for(TopicPartition partition : records.partitions()){List<ConsumerRecord<String, String>> pRecord = records.records(partition);for (ConsumerRecord<String, String> record : pRecord) {System.out.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());}long lastOffset = pRecord.get(pRecord.size() -1).offset();// 单个partition中的offset,并且进行提交Map<TopicPartition, OffsetAndMetadata> offset = new HashMap<>();offset.put(partition,new OffsetAndMetadata(lastOffset+1));// 提交offsetconsumer.commitSync(offset);System.out.println("=============partition - "+ partition +" end================");}}}/*手动指定offset的起始位置,及手动提交offset*/private static void controlOffset() {Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "false");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer(props);// jiangzh-topic - 0,1两个partitionTopicPartition p0 = new TopicPartition(TOPIC_NAME, 0);// 消费订阅某个Topic的某个分区consumer.assign(Arrays.asList(p0));while (true) {// 手动指定offset起始位置/*1、人为控制offset起始位置2、如果出现程序错误,重复消费一次*//*1、第一次从0消费【一般情况】2、比如一次消费了100条, offset置为101并且存入Redis3、每次poll之前,从redis中获取最新的offset位置4、每次从这个位置开始消费*/consumer.seek(p0, 700);ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));// 每个partition单独处理for(TopicPartition partition : records.partitions()){List<ConsumerRecord<String, String>> pRecord = records.records(partition);for (ConsumerRecord<String, String> record : pRecord) {System.err.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());}long lastOffset = pRecord.get(pRecord.size() -1).offset();// 单个partition中的offset,并且进行提交Map<TopicPartition, OffsetAndMetadata> offset = new HashMap<>();offset.put(partition,new OffsetAndMetadata(lastOffset+1));// 提交offsetconsumer.commitSync(offset);System.out.println("=============partition - "+ partition +" end================");}}}/*流量控制 - 限流*/private static void controlPause() {Properties props = new Properties();props.setProperty("bootstrap.servers", "192.168.220.128:9092");props.setProperty("group.id", "test");props.setProperty("enable.auto.commit", "false");props.setProperty("auto.commit.interval.ms", "1000");props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer(props);// jiangzh-topic - 0,1两个partitionTopicPartition p0 = new TopicPartition(TOPIC_NAME, 0);TopicPartition p1 = new TopicPartition(TOPIC_NAME, 1);// 消费订阅某个Topic的某个分区consumer.assign(Arrays.asList(p0,p1));long totalNum = 40;while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));// 每个partition单独处理for(TopicPartition partition : records.partitions()){List<ConsumerRecord<String, String>> pRecord = records.records(partition);long num = 0;for (ConsumerRecord<String, String> record : pRecord) {System.out.printf("patition = %d , offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());/*1、接收到record信息以后,去令牌桶中拿取令牌2、如果获取到令牌,则继续业务处理3、如果获取不到令牌, 则pause等待令牌4、当令牌桶中的令牌足够, 则将consumer置为resume状态*/num++;if(record.partition() == 0){if(num >= totalNum){consumer.pause(Arrays.asList(p0));}}if(record.partition() == 1){if(num == 40){consumer.resume(Arrays.asList(p0));}}}long lastOffset = pRecord.get(pRecord.size() -1).offset();// 单个partition中的offset,并且进行提交Map<TopicPartition, OffsetAndMetadata> offset = new HashMap<>();offset.put(partition,new OffsetAndMetadata(lastOffset+1));// 提交offsetconsumer.commitSync(offset);System.out.println("=============partition - "+ partition +" end================");}}}}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. [HNOI2013]消毒

    如果只有二维&#xff0c;那么我们建二分图求最大匹配&#xff0c;O(n^2)的复杂度可以实现。而现在是三维&#xff0c;发现不会三分图&#xff0c;好像也没有三分图这个算法… 再思考一下对于二维&#xff0c;是否有别的暴力实现方法&#xff1f; 我们可以暴力枚举哪些行是被…...

    2024/4/15 7:21:19
  2. 理论随心记——IPV4向IPV6过渡技术

    该内容只是以默写总结一些知识点而已&#xff0c;顺便分享出来和方便翻阅。无他。有错误的地方麻烦批评指正。十分感谢。 以下知识内容学习于《谢希仁计算机网络第七版》 以前一直用的是IPV4地址&#xff0c;由于如今地址不够&#xff0c;所以有了IPV6地址。但是不可能一下子全…...

    2024/4/3 19:28:45
  3. 面试汇总(三):计算机网络常见面试总结(一)

    前言 上一篇文章我们介绍了在面试中数据库常见的面试题。今天我们给大家介绍在面试中&#xff0c;计算机网络常见的面试题。计算机网络在计算机行业中是一门最基础的技术&#xff0c;无论是在开发项目还是在算法岗&#xff0c;项目的应用最终还是落实在用户的使用&#xff0c;网…...

    2024/4/23 11:23:09
  4. 如何把ssm项目和vue项目部署在云服务器(上)

    一、引入 URL的概念理解 在WWW上&#xff0c;每一信息资源都有统一的且在网上唯一的地址&#xff0c;该地址就叫URL&#xff08;Uniform Resource Locator,统一资源定位器&#xff09;&#xff0c;它是WWW的统一资源定位标志&#xff0c;就是指网络地址 URL由三部分组成&#…...

    2024/4/1 17:38:40
  5. CIBERSORTx数据上传格式

    CIBERSORTx简介 一个利用反卷积算法将癌组织的表达数据推断各种免疫细胞的占比&#xff0c;默认提供22种作者自己训练得到的分析矩阵&#xff08;用来分解组织级别的表达数据&#xff09;&#xff0c;也可以自己利用单细胞表达数据来构建这个数据集。 CIBERSORTx是第二个版本&…...

    2024/4/4 9:30:39
  6. UML类图和类之间的关系

    目录1. 类和接口的UML表示类接口2. 类之间的关系泛化&#xff08;继承&#xff09;实现依赖关联聚合组合区别统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;是用来设计软件蓝图的可视化建模语言&#xff0c;一种用于软件系统分析和设计的工具。…...

    2024/4/22 13:11:34
  7. 微信小程序中引入阿里矢量图标库

    阿里矢量图标下载地址 1.需要将引入的css文件后缀改为微信小程序识别的wxss 在index.wxss文件中引入图标样式 import "../../css/iconfont.wxss";在index.wxml中使用图标 <!--关于我们 start--> <view class"about"><view class"t…...

    2024/4/22 6:53:07
  8. 如何完美的解决跨域问题(具体步骤)

    解决跨域的四种方案 1.利用script标签的src属性不受同源策略限制。因为所有的src属性和href属性都不受同源策略限制。可以请求第三方服务器数据内容。 //1、去创建一个script标签 var script document.createElement("script");//2、script的src属性设置接口地址…...

    2024/4/21 13:32:29
  9. 用scons编译STM32F103工程

    想用vscode来实现代码的编辑与调试代码&#xff0c;原先这个工程是用STM32CUBEIDE建立的&#xff0c;参照STM32CUBEIDE的编译过程&#xff0c;编写了下面的scons脚本&#xff0c;scons是初次了解&#xff0c;既然是python脚本&#xff0c;那么会什么就怎么写吧。 import os im…...

    2024/4/18 23:16:37
  10. LeetCode63、不同路径II(dp类型题目)

    题目描述 动态规划做法&#xff1a; 对比上一道题&#xff0c;这里添加了障碍&#xff0c;所以我们需要进行边界的处理。 class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m obstacleGrid.length;if(obstacleGridnull||m0){return 0;}int …...

    2024/4/5 5:55:11
  11. Vue CLI 3.0安装总结

    为啥 之前也安装过vue cli脚手架,可以用vue ui打开可视化面板,今天尝试一下就不行了,之前有一次电脑删除了一些东西,导致node下载包管理就不行了,想着也没有重新安装node,而是找人要了一个npm包管理文件,陆陆续续下载了一些包,有些包资源下载又可以用,yarn,rimraf等,但没有用v…...

    2024/4/22 17:53:42
  12. MySQL中的列转行

    mysql中的列转行 在工作中遇到的一个MySQL列转行的统计&#xff1a; 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签&#xff0c;在数据库中记录的是数组样式的字符串&#xff0c;数据样式大致如下&#xff1a; iduser_idlike_tagscreate_time11101[“八卦”,“…...

    2024/4/3 15:23:35
  13. 如何在win10系统下解决右键文件或桌面无法打开选项同时系统短暂性死机

    如果出现标题情况的话&#xff0c;简单的方法如下、 1、下载火绒安全软件或者任意一个其他的安全软件&#xff0c;打开火绒安全软件下的安全工具 火绒安全软件界面 2、选择右键管理 3、可以选择文件右键管理&#xff08;如果打开文件右键很卡&#xff09;或者桌面右键管理&…...

    2024/4/24 22:24:55
  14. elasticsearch 查询语句中must与should一起使用,should失效

    这是写过最短的一个博客了。 当查询语句中包含must与should的时候&#xff0c;发现should失效。那我们就把must改成must_not&#xff0c;逻辑再取反就可以了&#xff08;无意中发现&#xff09;。 希望能帮到大家&#xff0c;真TM有趣&#xff5e; 贴俩真实语句给大家看看把…...

    2024/4/18 16:57:33
  15. 想问一下数学所有没有MMS新版本?能做点积分和微分

    想问一下MMS有没有新版本&#xff0c;能够做不定积分&#xff0c;或者有比较多一些代数口令&#xff0c;如 int&#xff0c;diff&#xff0c; subs&#xff0c; collect, combine, factor, frontend, normal, sort, Expand 这些命令 或者有个完整的指令集帮助文件&#xff…...

    2024/4/6 3:43:56
  16. 引入测试报告与结构优化(三)

    1、将所有测试用例的.py文件放到同一个文件夹test_case&#xff0c;并添加__init__.py文件 2、把执行测试的all_test.py文件单独放在test_case文件夹外面 3、将如登录&#xff0c;退出等不属于完整测试用例的公共模块&#xff0c;单独创建一个文件夹 all_test.py文件移出来 将…...

    2024/4/6 7:16:31
  17. Linux 文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。 属性检测描述如下&#xff1a; 操作符 说明 举例 -b file 检测文件是否是块设备文件&#xff0c;如果是&#xff0c;则返回 true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件&#xff0c;如果是&#xff0…...

    2024/4/10 5:49:51
  18. Python-pandas库安装失败

    在python的Lib路径下(到路径后D:/Mysoftware/Lib输入cmd&#xff0c;打开命令行): 使用pip --default-timeout1000 install pandas&#xff0c;成功安装。 :)...

    2024/4/13 7:52:39
  19. Vue学习之el挂载点详解

    文章目录1、Vue实例的作用范围2、el是否可以使用其他选择器3、能否设置其他的dom元素1、Vue实例的作用范围 Vue会管理el选项命中的元素及其内部的后代元素 2、el是否可以使用其他选择器 目前使用的是id选择器 使用class选择器 可以使用class选择器 使用标签选择器 注意&…...

    2024/4/1 17:13:08
  20. Retrofit 支持 Kotlin 协程

    上期 Retrofit 源码解读&#xff0c;这期查看下如何支持 Kotlin 协程的。&#xff08;上篇的 retrofit 版本 可能与这篇不同&#xff09; 例子还是最简单的标准例子&#xff0c;定义 interface 接口&#xff0c;这里就不贴多余代码了 GET("/app/v1/commodity")suspe…...

    2024/4/15 7:23:16

最新文章

  1. 从 Android 恢复已删除文件的 3 种简单方法

    如何从 Android 恢复已删除的文件&#xff1f;毫不犹豫&#xff0c;有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是&#xff0c;如果删除的文件未同步到您的帐户或未备份怎么办&#xff1f;您错误的恢复可能会永久删除您想要的数据。因此&#xff0c;我们发布…...

    2024/4/25 12:43:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 动态规划刷题(算法竞赛、蓝桥杯)--饥饿的奶牛(线性DP)

    1、题目链接&#xff1a;饥饿的奶牛 - 洛谷 #include <bits/stdc.h> using namespace std; const int N3000010; vector<int> a[N];//可变数组vector存区间 int n,mx,f[N]; int main(){scanf("%d",&n);for(int i1;i<n;i){int x,y;scanf("%…...

    2024/4/23 6:20:55
  4. JVM笔记

    1.JVM与Java体系结构 1.1. 前言 作为Java工程师的你曾被伤害过吗&#xff1f;你是否也遇到过这些问题&#xff1f; 运行着的线上系统突然卡死&#xff0c;系统无法访问&#xff0c;甚至直接OOM想解决线上JVM GC问题&#xff0c;但却无从下手新项目上线&#xff0c;对各种JVM…...

    2024/4/23 6:09:03
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/25 1:03:45
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/24 1:17:44
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/24 11:04:21
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/25 10:01:46
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/24 11:04:20
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/24 11:04:20
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/24 9:58:43
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/24 11:04:19
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/24 11:04:19
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/24 11:04:18
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/24 11:04:18
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/24 11:04:17
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/25 3:28:56
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/25 3:39:58
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/24 11:04:13
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/24 11:04:13
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/24 11:04:13
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/24 9:54:49
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/24 10:43:15
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/25 1:03:22
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57