Spring Batch学习,和Spring Cloud Stream区别

news2025/5/17 12:43:20

Spring Batch学习,和Spring Cloud Stream区别

  • 1. 使用Spring Initializr创建项目
  • 2. 使用步骤构建作业(Chunk 模式)
    • 🧩 场景说明
    • 🧰 1. 示例目录结构
    • 📄 2. 创建输入文件(`users.csv`)
    • 🧱 3. 创建实体类(`User.java`)
    • 🔄 4. 编写处理器(`UserItemProcessor.java`)
    • ⚙️ 5. Job 配置(`ChunkJobConfig.java`)
    • 🚀 6. 启动类(`BatchDemoApplication.java`)
    • 📄 7. 配置文件(`application.yml`)
    • ✅ 8. 启动后输出示例
    • 🎓 小结
  • 3. 添加容错功能(retry、skip)
    • 🎯 场景目标
    • 🧱 修改点概览
    • 🧩 1. 修改 `UserItemProcessor.java`,模拟失败逻辑
    • 🛠️ 2. 修改 `chunkStep()`:添加容错配置
    • 📄 3. 示例 CSV 文件(`users.csv`)
    • ✅ 4. 启动后控制台输出示例
    • 🔎 总结关键 API
  • 4. 多步骤 Job 示例(多个 Step 串联)
    • 🎯 模块目标
    • 🗂 项目结构说明(在原基础上新增)
    • 📄 1. 创建 Tasklet 步骤:通知任务(`NotificationTasklet.java`)
    • ⚙️ 2. 多步骤 Job 配置(`MultiStepJobConfig.java`)
    • ✅ 3. 控制台输出预期
    • 🧠 关键知识点
  • 5. 定时调度执行 Spring Batch Job
    • 📦 添加定时任务类(`ScheduledJobLauncher.java`)
    • ✅ 注意:
    • 🔧 开启定时任务功能(`BatchDemoApplication.java`)
    • 🛠 示例控制台输出(每 30 秒一次)
    • 🎓 小结
  • 6. Spring Cloud Stream和Spring Batch区别
    • 🧠 一句话总结
    • 🔍 核心区别详解

参考文章: Building a Batch Application with Spring Batch - Spring Academy

1. 使用Spring Initializr创建项目

[~/exercises] $ curl -o 'billing-job.zip' 'https://start.spring.io/starter.zip?type=gradle-project&language=java&dependencies=batch%2Cpostgresql&name=Billing+Job&groupId=example&artifactId=billing-job&description=Billing+job+for+Spring+Cellular&packaging=jar&packageName=example.billingjob&javaVersion=17' && unzip -d 'billing-job' 'billing-job.zip'
cd billing-job

查看目录

[~/exercises/billing-job] $ tree .
.
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── example
    │   │       └── billingjob
    │   │           └── BillingJobApplication.java
    │   └── resources
    │       └── application.properties
    └── test
        └── java
            └── example
                └── billingjob
                    └── BillingJobApplicationTests.java

11 directories, 8 files

创建配置文件

package example.billingjob;

import org.springframework.context.annotation.Configuration;

@Configuration
public class BillingJobConfiguration {
  // TODO add job definition here
}
[~/exercises] $ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                      NAMES
c711e7873371   postgres:14.1-alpine   "docker-entrypoint.s…"   20 minutes ago   Up 20 minutes   127.0.0.1:5432->5432/tcp   postgres
[~/exercises] $

连接数据库创建表

[~/exercises] $ docker exec -it postgres psql -U postgres
psql (14.1)
Type "help" for help.
postgres=#
CREATE TABLE BATCH_JOB_INSTANCE  (
    JOB_INSTANCE_ID BIGINT  NOT NULL PRIMARY KEY ,
    VERSION BIGINT ,
    JOB_NAME VARCHAR(100) NOT NULL,
    JOB_KEY VARCHAR(32) NOT NULL,
    constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ;
CREATE TABLE BATCH_JOB_EXECUTION  (
    JOB_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
    VERSION BIGINT  ,
    JOB_INSTANCE_ID BIGINT NOT NULL,
    CREATE_TIME TIMESTAMP NOT NULL,
    START_TIME TIMESTAMP DEFAULT NULL ,
    END_TIME TIMESTAMP DEFAULT NULL ,
    STATUS VARCHAR(10) ,
    EXIT_CODE VARCHAR(2500) ,
    EXIT_MESSAGE VARCHAR(2500) ,
    LAST_UPDATED TIMESTAMP,
    constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
    references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS  (
    JOB_EXECUTION_ID BIGINT NOT NULL ,
    PARAMETER_NAME VARCHAR(100) NOT NULL ,
    PARAMETER_TYPE VARCHAR(100) NOT NULL ,
    PARAMETER_VALUE VARCHAR(2500) ,
    IDENTIFYING CHAR(1) NOT NULL ,
    constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_STEP_EXECUTION  (
    STEP_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
    VERSION BIGINT NOT NULL,
    STEP_NAME VARCHAR(100) NOT NULL,
    JOB_EXECUTION_ID BIGINT NOT NULL,
    CREATE_TIME TIMESTAMP NOT NULL,
    START_TIME TIMESTAMP DEFAULT NULL ,
    END_TIME TIMESTAMP DEFAULT NULL ,
    STATUS VARCHAR(10) ,
    COMMIT_COUNT BIGINT ,
    READ_COUNT BIGINT ,
    FILTER_COUNT BIGINT ,
    WRITE_COUNT BIGINT ,
    READ_SKIP_COUNT BIGINT ,
    WRITE_SKIP_COUNT BIGINT ,
    PROCESS_SKIP_COUNT BIGINT ,
    ROLLBACK_COUNT BIGINT ,
    EXIT_CODE VARCHAR(2500) ,
    EXIT_MESSAGE VARCHAR(2500) ,
    LAST_UPDATED TIMESTAMP,
    constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT  (
    STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
    SHORT_CONTEXT VARCHAR(2500) NOT NULL,
    SERIALIZED_CONTEXT TEXT ,
    constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
    references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ;
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT  (
    JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
    SHORT_CONTEXT VARCHAR(2500) NOT NULL,
    SERIALIZED_CONTEXT TEXT ,
    constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE;

检查创建的表

postgres=# \d
                      List of relations
 Schema |             Name             |   Type   |  Owner
--------+------------------------------+----------+----------
 public | batch_job_execution          | table    | postgres
 public | batch_job_execution_context  | table    | postgres
 public | batch_job_execution_params   | table    | postgres
 public | batch_job_execution_seq      | sequence | postgres
 public | batch_job_instance           | table    | postgres
 public | batch_job_seq                | sequence | postgres
 public | batch_step_execution         | table    | postgres
 public | batch_step_execution_context | table    | postgres
 public | batch_step_execution_seq     | sequence | postgres
(9 rows)
postgres=#

修改配置billing-job/src/main/resources/application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres

2. 使用步骤构建作业(Chunk 模式)

很好!下面是 Spring Batch 模块 2:使用步骤构建作业(Chunk 模式) 的完整示例,模拟一个典型的「读取 → 处理 → 写入」的场景。


🧩 场景说明

我们将读取一个 CSV 文件中的用户信息(users.csv),处理数据(将用户名转为大写),然后将处理结果打印出来(模拟写入数据库)。


🧰 1. 示例目录结构

src/
├── main/
│   ├── java/
│   │   └── com/example/batch/
│   │       ├── BatchDemoApplication.java
│   │       ├── config/ChunkJobConfig.java
│   │       ├── model/User.java
│   │       ├── processor/UserItemProcessor.java
│   ├── resources/
│       ├── users.csv
│       └── application.yml

📄 2. 创建输入文件(users.csv

id,name
1,alice
2,bob
3,charlie

🧱 3. 创建实体类(User.java

public class User {
    private Long id;
    private String name;

    // 构造方法、getter/setter

    public User() {}

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "'}";
    }
}

🔄 4. 编写处理器(UserItemProcessor.java

@Component
public class UserItemProcessor implements ItemProcessor<User, User> {
    @Override
    public User process(User user) {
        user.setName(user.getName().toUpperCase());
        return user;
    }
}

⚙️ 5. Job 配置(ChunkJobConfig.java

@Configuration
@EnableBatchProcessing
public class ChunkJobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    @Autowired
    private UserItemProcessor processor;

    // 读取器:从 CSV 文件中读取数据
    @Bean
    public FlatFileItemReader<User> reader() {
        return new FlatFileItemReaderBuilder<User>()
                .name("userItemReader")
                .resource(new ClassPathResource("users.csv"))
                .delimited()
                .names("id", "name")
                .fieldSetMapper(fieldSet -> new User(
                        fieldSet.readLong("id"),
                        fieldSet.readString("name")
                ))
                .linesToSkip(1) // 跳过标题行
                .build();
    }

    // 写入器:将处理后的数据打印到控制台(模拟写数据库)
    @Bean
    public ItemWriter<User> writer() {
        return users -> {
            System.out.println("📥 写入数据:");
            users.forEach(System.out::println);
        };
    }

    @Bean
    public Step chunkStep() {
        return stepBuilderFactory.get("chunkStep")
                .<User, User>chunk(2) // 每2个为一个块处理
                .reader(reader())
                .processor(processor)
                .writer(writer())
                .build();
    }

    @Bean
    public Job chunkJob() {
        return jobBuilderFactory.get("chunkJob")
                .start(chunkStep())
                .build();
    }
}

🚀 6. 启动类(BatchDemoApplication.java

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

📄 7. 配置文件(application.yml

spring:
  batch:
    job:
      enabled: true
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true

✅ 8. 启动后输出示例

📥 写入数据:
User{id=1, name='ALICE'}
User{id=2, name='BOB'}
📥 写入数据:
User{id=3, name='CHARLIE'}

🎓 小结

部件作用
ItemReader读取数据源(CSV)
ItemProcessor转换数据(小写转大写)
ItemWriter输出结果(控制台)
chunk(n)每 n 条数据为一个事务处理块

3. 添加容错功能(retry、skip)


🎯 场景目标

在上一个示例基础上,模拟某些数据处理失败 的情况,并配置:

  • ✅ 自动重试指定异常(如最多重试 2 次)
  • ✅ 跳过指定异常(跳过错误记录继续执行)

🧱 修改点概览

部分修改
processor模拟处理过程中抛异常
chunkStep()添加 .faultTolerant().retry().skip() 配置
控制台输出可看到错误被捕获、重试、跳过后的行为

🧩 1. 修改 UserItemProcessor.java,模拟失败逻辑

@Component
public class UserItemProcessor implements ItemProcessor<User, User> {

    @Override
    public User process(User user) throws Exception {
        // 模拟用户 id 为 2 的处理会失败
        if (user.getId() == 2) {
            System.out.println("❌ 模拟处理异常:用户 " + user.getName());
            throw new IllegalArgumentException("处理用户失败!");
        }
        user.setName(user.getName().toUpperCase());
        return user;
    }
}

🛠️ 2. 修改 chunkStep():添加容错配置

@Bean
public Step chunkStep() {
    return stepBuilderFactory.get("chunkStep")
            .<User, User>chunk(2)
            .reader(reader())
            .processor(processor)
            .writer(writer())
            .faultTolerant()                            // 开启容错模式
            .retry(IllegalArgumentException.class)     // 指定重试异常
            .retryLimit(2)                              // 最多重试 2 次
            .skip(IllegalArgumentException.class)      // 如果还失败则跳过
            .skipLimit(5)                               // 最多跳过 5 个
            .build();
}

📄 3. 示例 CSV 文件(users.csv

id,name
1,alice
2,bob      <-- 模拟失败
3,charlie

✅ 4. 启动后控制台输出示例

👉 正在读取用户数据...
📥 写入数据:
User{id=1, name='ALICE'}
❌ 模拟处理异常:用户 bob
⚠️ 重试第1次...
❌ 模拟处理异常:用户 bob
⚠️ 重试第2次...
❌ 模拟处理异常:用户 bob
⚠️ 达到重试次数限制,跳过该用户

📥 写入数据:
User{id=3, name='CHARLIE'}

你将看到:

  • 用户 bob 被处理时故意失败
  • 自动重试 2 次
  • 重试仍失败 → 被跳过
  • Job 正常完成,未中断!

🔎 总结关键 API

方法含义
.faultTolerant()启用容错处理
.retry(Exception.class)出现该异常时会自动重试
.retryLimit(n)最大重试次数
.skip(Exception.class)如果重试仍失败,可以跳过
.skipLimit(n)最大跳过条数,超过就 fail

4. 多步骤 Job 示例(多个 Step 串联)


🎯 模块目标

我们将构建一个包含多个 Step 的 Job:

  1. Step 1:打印 Job 启动信息
  2. Step 2:执行 chunk 处理逻辑(读取、处理、写入用户)
  3. Step 3:清理任务或发送通知(模拟)

🗂 项目结构说明(在原基础上新增)

├── config/
│   └── MultiStepJobConfig.java    <-- 新增:多个步骤的 Job 配置
├── service/
│   └── NotificationTasklet.java   <-- 新增:通知步骤

📄 1. 创建 Tasklet 步骤:通知任务(NotificationTasklet.java

@Component
public class NotificationTasklet implements Tasklet {
    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        System.out.println("📣 所有用户处理完成,发送通知!");
        return RepeatStatus.FINISHED;
    }
}

⚙️ 2. 多步骤 Job 配置(MultiStepJobConfig.java

@Configuration
public class MultiStepJobConfig {

    @Autowired private JobBuilderFactory jobBuilderFactory;
    @Autowired private StepBuilderFactory stepBuilderFactory;

    @Autowired private FlatFileItemReader<User> reader;
    @Autowired private ItemProcessor<User, User> processor;
    @Autowired private ItemWriter<User> writer;
    @Autowired private NotificationTasklet notificationTasklet;

    @Bean
    public Step startStep() {
        return stepBuilderFactory.get("startStep")
                .tasklet((contribution, context) -> {
                    System.out.println("🚀 Job 开始执行!");
                    return RepeatStatus.FINISHED;
                }).build();
    }

    @Bean
    public Step chunkStep() {
        return stepBuilderFactory.get("chunkStep")
                .<User, User>chunk(2)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .faultTolerant()
                .retry(IllegalArgumentException.class)
                .retryLimit(2)
                .skip(IllegalArgumentException.class)
                .skipLimit(5)
                .build();
    }

    @Bean
    public Step notifyStep() {
        return stepBuilderFactory.get("notifyStep")
                .tasklet(notificationTasklet)
                .build();
    }

    @Bean
    public Job multiStepJob() {
        return jobBuilderFactory.get("multiStepJob")
                .start(startStep())
                .next(chunkStep())
                .next(notifyStep())
                .build();
    }
}

✅ 3. 控制台输出预期

🚀 Job 开始执行!
📥 写入数据:
User{id=1, name='ALICE'}
❌ 模拟处理异常:用户 bob
⚠️ 重试中...
📥 写入数据:
User{id=3, name='CHARLIE'}
📣 所有用户处理完成,发送通知!

🧠 关键知识点

概念说明
多个 Step使用 .start().next().next() 串联
Tasklet Step适合执行单个逻辑(如日志、通知)
Chunk Step适合批量数据处理
JobBuilder构建包含多个 Step 的流程

5. 定时调度执行 Spring Batch Job

📦 添加定时任务类(ScheduledJobLauncher.java

@Component
public class ScheduledJobLauncher {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    @Qualifier("multiStepJob")  // 使用我们前面定义的 Job
    private Job job;

    @Scheduled(fixedRate = 30000) // 每 30 秒触发一次
    public void runJob() {
        try {
            JobParameters params = new JobParametersBuilder()
                    .addLong("timestamp", System.currentTimeMillis()) // 保证每次唯一
                    .toJobParameters();

            System.out.println("⏰ 定时任务启动 Job...");
            jobLauncher.run(job, params);
        } catch (Exception e) {
            System.err.println("❌ Job 启动失败:" + e.getMessage());
        }
    }
}

✅ 注意:

Spring Batch 的 Job 每次执行都需要唯一参数(否则不会重复执行),因此我们加了:

.addLong("timestamp", System.currentTimeMillis())

🔧 开启定时任务功能(BatchDemoApplication.java

@SpringBootApplication
@EnableScheduling  // 启用定时任务功能
public class BatchDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(BatchDemoApplication.class, args);
    }
}

🛠 示例控制台输出(每 30 秒一次)

⏰ 定时任务启动 Job...
🚀 Job 开始执行!
📥 写入数据:
User{id=1, name='ALICE'}
❌ 模拟处理异常:用户 bob
📥 写入数据:
User{id=3, name='CHARLIE'}
📣 所有用户处理完成,发送通知!

🎓 小结

组件功能
@Scheduled每隔一段时间自动触发 Job
JobLauncher手动执行指定 Job
JobParametersBuilder创建 Job 参数,确保唯一性
@EnableScheduling启用定时任务功能

6. Spring Cloud Stream和Spring Batch区别

🧠 一句话总结

框架关注点用于什么
Spring Cloud Stream实时消息流处理处理从消息队列(如 Kafka、RabbitMQ)中来的事件流
Spring Batch批量任务处理处理大量结构化数据的离线批处理任务,如夜间账单

🔍 核心区别详解

特性 / 区别点Spring Cloud StreamSpring Batch
💡 处理模式异步、实时流式处理(事件驱动)同步、批量处理(定时或手动触发)
🕘 适用场景IoT 数据流、订单事件、消息队列消费者、微服务事件链路日终结算、数据库导入导出、文件解析、大规模数据迁移
🔌 输入来源Kafka、RabbitMQ、Pulsar 等消息中间件数据库、CSV、XML、REST 接口等
🔄 输出目标下游队列或服务数据库、文件、API
🧱 组成模型Supplier、Function、ConsumerStep、Job、ItemReader、ItemProcessor、ItemWriter
💥 故障处理支持 Retry、DLQ、分区等支持跳过、重试、事务、Job Restart
🛠️ 持久化状态一般无状态,靠中间件保证可靠传递有状态,支持 Job Execution 状态保存(如重启恢复)
🧪 测试/调试流处理链可拆解为小函数,易于集成测试Job 参数可控制执行,适合验证数据处理逻辑
🧰 配置方式application.yml(通道绑定)XML/Java DSL 配置 Job、Step、Reader 等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

官方的可以在kibana 控制台上进行查询&#xff1a; POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询&#xff0c;但是可以使用postman接口进行查询&#xff1a;

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

从技术视角解构 Solana Meme 币生态

在高吞吐、高并发的 Solana 网络上&#xff0c;一类轻量化、高热度的代币形式正在爆发式增长——Meme Token&#xff08;迷因代币&#xff09;。尽管起源于社群文化&#xff0c;但其技术实现并非“玩笑”&#xff0c;而是一整套构建于 Solana Runtime 与 Token Extensions 之上…

智能接处警系统:以秒级联动响应重塑应急处置效能

​​随着我国能源、化工、航空等关键行业的快速发展&#xff0c;传统消防管理模式已难以满足高效应急响应的需求。国家能源局、应急管理部、民航总局均出台专项规定&#xff0c;对消防站建设提出更高要求&#xff0c;在此背景下&#xff0c;智能接处警系统正是应对这些挑战的核…

GpuGeek 网络加速:破解 AI 开发中的 “最后一公里” 瓶颈

摘要&#xff1a; 网络延迟在AI开发中常被忽视&#xff0c;却严重影响效率。GpuGeek通过技术创新&#xff0c;提供学术资源访问和跨国数据交互的加速服务&#xff0c;助力开发者突破瓶颈。 目录 一、引言&#xff1a;当算力不再稀缺&#xff0c;网络瓶颈如何破局&#xff1f; …

C# DataGridView 选中所有复选框

问题描述 在程序中尝试选中所有复选框&#xff0c;但出现错误。如果单击顶部的完整选中/释放复选框&#xff0c;同时选中包含复选框的列&#xff0c;则选定区域不会改变。该如何解决&#xff1f; 上面的图片是点击完整版本之后的。 下面是本文的测试代码&#xff0c;函数 dat…

AB Download Manager v1.5.8 开源免费下载工具

下载文件是我们日常工作和生活中经常进行的操作。面对动辄数十GB的4K影片、设计素材包或开发工具&#xff0c;传统浏览器的单线程下载如同"涓涓细流"&#xff0c;非常影响我们的效率和体验。 那么&#xff0c;一款高效且易用的下载工具至关重要。今天就让我们解锁这…

深度剖析:Dify+Sanic+Vue+ECharts 搭建 Text2SQL 项目 sanic-web 的 Debug 实战

目录 项目背景介绍sanic-web Dify\_service handle\_think\_tag报错NoneType问题描述debug Dify调用不成功&#xff0c;一直转圈圈问题描述debug 前端markdown格式只显示前5页问题描述debug1. 修改代码2.重新构建1.1.3镜像3.更新sanic-web/docker/docker-compose.yaml4. 重新部…

学习51单片机02

吐血了&#xff0c;板子今天才到&#xff0c;下午才刚开始学的&#xff0c;生气了&#xff0c;害我笔记都断更了一天。。。。 紧接上文...... 如何将HEX程序烧写到程序? Tips&#xff1a;HEX 文件是一种常用于单片机等嵌入式系统的文件格式&#xff0c;它包含了程序的机器码…

麒麟服务器操作系统安装 MySQL 8 实战指南

往期好文连接&#xff1a;统信UOS/麒麟KYLINOS安装JDBC驱动包 Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟服务器操作系统上安装 MySQL 8 的文章&#xff0c;欢迎大家分享点赞&#xff0c;点个在看和关注吧&#xff01;MySQL 作为主流开源数据库之一&#x…

AWS EC2 微服务 金丝雀发布(Canary Release)方案

为什么需要实现金丝雀发布? 在当前项目的工程实践中, 已经有了充分的单元测试, 预发布环境测试, 但是还是会在线上环境出现非预期的情况, 导致线上事故, 因此, 为了提升服务质量, 需要线上能够有一个预验证的机制. 如何实现金丝雀发布? 使用AWS code deploy方案 AWS code…

支持蓝牙5.0和2.4G私有协议芯片-PHY6222

PHY6222QC-W04C 是一款适用于蓝牙低功耗&#xff08;BLE&#xff09;5.2 应用的片上系统&#xff08;SoC&#xff09;。它搭载 ARM Cortex™-M0 32 位处理器&#xff0c;配备 64KB SRAM、512K Flash、96KB ROM、256 bit efuse &#xff0c;以及超低功耗、高性能的多模式射频模块…

图像锐化调整

一、背景介绍 之前找多尺度做对比度增强时候&#xff0c;发现了一些锐化相关算法&#xff0c;正好本来也要整理锐化&#xff0c;这里就直接顺手对之前做过的锐化大概整理了下&#xff0c;方便后续用的时候直接抓了。 这里整理的锐化主要是两块&#xff1a;一个是参考论文&#…

找客户的app

找客户的 app 在竞争激烈的商业环境中&#xff0c;找客户的 APP 成为企业拓展业务的利器。 微拓客 APP&#xff0c;集智能获客、营销素材、客户管理于一体。支持关键词、附近客源等多方式采集&#xff0c;覆盖 300 行业&#xff1b;一键采集客源&#xff0c;一键导出到通讯录…

​​金融合规革命:​​R²AIN SUITE 如何重塑银行业务智能​

一、市场发展背景与核心驱动因素​ 信息过载​&#xff1a;单家银行年均新增监管文件大量增加&#xff0c;人工解读效率极低。 客户体验升级​&#xff1a;高净值客户期待“724小时专业级响应”&#xff0c;但客户经理难以实时掌握数百款产品动态。 风险防控​&#xff1a;传…

论文阅读:Self-Collaboration Code Generation via ChatGPT

地址&#xff1a;Self-Collaboration Code Generation via ChatGPT 摘要 尽管大型语言模型&#xff08;LLMs&#xff09;在代码生成能力方面表现出色&#xff0c;但在处理复杂任务时仍存在挑战。在现实软件开发中&#xff0c;人类通常通过团队协作来应对复杂任务&#xff0c;…