展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Spring Boot配置多个Quartz任务方法

Spring Boot配置多个Quartz任务方法

本文详细阐述了如何在SpringBoot应用中配置和管理多个Quartz定时任务。通过定义独立的Job类、JobDetailFactoryBean和SimpleTriggerFactoryBean来封装每个任务及其调度逻辑,并利用Spring的依赖注入机制,将这些任务和触发器集合统一注册到SchedulerFactoryBean中,从而实现灵活且可扩展的多任务调度。

在Spring Boot中配置多个Quartz任务

本文详细阐述了如何在Spring Boot应用中配置和管理多个Quartz定时任务。通过定义独立的Job类、JobDetailFactoryBean和SimpleTriggerFactoryBean来封装每个任务及其调度逻辑,并利用Spring的依赖注入机制,将这些任务和触发器集合统一注册到SchedulerFactoryBean中,从而实现灵活且可扩展的多任务调度。

引言

在企业级应用开发中,定时任务是不可或缺的一部分,例如数据同步、报表生成、缓存更新等。Quartz是一个功能强大、灵活的开源任务调度框架,与Spring Boot集成可以实现高效的任务管理。当需要调度多个不同的任务时,如何优雅地进行配置和扩展是关键。本教程将指导您如何在Spring Boot应用中配置多个Quartz定时任务。

Quartz核心概念回顾

在深入多任务配置之前,我们先回顾Quartz的几个核心概念:

  1. Job (任务):定义了实际要执行的业务逻辑。在Java中,通常是一个实现org.quartz.Job接口的类,其execute方法包含任务的具体操作。
  2. JobDetail (任务详情):JobDetail实例用于定义一个Job的实例。它包含了Job的类型、名称、组以及其他与任务相关的持久化数据(JobDataMap)。Spring提供了JobDetailFactoryBean来简化JobDetail的创建。
  3. Trigger (触发器):定义了Job何时执行的调度规则。Quartz提供了多种触发器类型,例如SimpleTrigger(用于简单重复调度)和CronTrigger(用于基于Cron表达式的复杂调度)。Spring提供了SimpleTriggerFactoryBean和CronTriggerFactoryBean来简化触发器的创建。
  4. Scheduler (调度器):是Quartz的核心组件,负责协调JobDetail和Trigger,启动、停止和管理所有已注册的调度任务。Spring提供了SchedulerFactoryBean来集成Quartz调度器到Spring应用上下文中。
  5. JobFactory (任务工厂):当Quartz需要实例化一个Job时,它会通过JobFactory来获取Job实例。Spring集成的Quartz通常会使用SpringBeanJobFactory(或其子类如AutowiringSpringBeanJobFactory),以便Quartz能够创建由Spring容器管理的Job实例,从而允许Job内部注入Spring Bean。

单个Quartz任务的配置挑战

在最初的单任务配置中,通常会直接将单个JobDetail和Trigger设置给SchedulerFactoryBean:

// 示例:单个任务配置片段
@Bean
public SchedulerFactoryBean schedulerFactoryBean(Trigger simpleJobTrigger) throws IOException {
    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
    // ... 其他配置
    schedulerFactory.setTriggers(simpleJobTrigger); // 直接设置单个Trigger
    // ...
    return schedulerFactory;
}

@Bean
public JobDetailFactoryBean keywordPostJobDetail() {
    JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
    factoryBean.setJobClass(DomainOrgCheckJob.class); // 指定单个Job类
    factoryBean.setDurability(true);
    return factoryBean;
}

这种方式对于单个任务是有效的,但当需要添加第二个或更多任务时,直接在SchedulerFactoryBean中添加多个setTriggers()或setJobDetails()方法显然是不行的,因为它们通常只接受单个对象或数组。

配置多个Quartz任务的策略

要配置多个Quartz任务,核心思想是为每个任务创建独立的JobDetail和Trigger,然后将它们作为一个集合传递给SchedulerFactoryBean。具体步骤如下:

1. 定义多个Job类

首先,为每个需要调度的任务创建独立的Java类,并实现org.quartz.Job接口。

// 第一个任务类
public class FirstDomainOrgCheckJob implements Job {
    private static final Logger LOG = LoggerFactory.getLogger(FirstDomainOrgCheckJob.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        LOG.info("FirstDomainOrgCheckJob : FirstJob fired at {}", new Date());
        // 实际的业务逻辑
    }
}

// 第二个任务类
public class SecondDomainOrgCheckJob implements Job {
    private static final Logger LOG = LoggerFactory.getLogger(SecondDomainOrgCheckJob.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        LOG.info("SecondDomainOrgCheckJob : SecondJob fired at {}", new Date());
        // 实际的业务逻辑
    }
}

2. 定义多个JobDetailFactoryBean

为每个Job类创建对应的JobDetailFactoryBean。通过@Bean注解将其注册为Spring Bean,并使用@Qualifier指定唯一的名称,以便后续的触发器可以引用。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;

@Configuration
public class SchedulerConfig {
    // ... 其他配置,如JobFactory, quartzProperties ...

    @Bean(name = "FirstJobDetail") // 使用@Qualifier指定名称
    public JobDetailFactoryBean firstJobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(FirstDomainOrgCheckJob.class);
        jobDetailFactory.setDurability(true); // 即使没有活跃的触发器,JobDetail也会保留
        return jobDetailFactory;
    }

    @Bean(name = "SecondJobDetail") // 使用@Qualifier指定名称
    public JobDetailFactoryBean secondJobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(SecondDomainOrgCheckJob.class);
        jobDetailFactory.setDurability(true);
        return jobDetailFactory;
    }
}

3. 定义多个SimpleTriggerFactoryBean

为每个JobDetail创建对应的SimpleTriggerFactoryBean。同样使用@Bean注解,并通过@Qualifier引用之前定义的JobDetail。任务的调度频率可以从配置文件中读取。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import org.quartz.SimpleTrigger;
import org.quartz.JobDetail;

@Configuration
public class SchedulerConfig {
    // ... 其他配置 ...

    @Bean
    public SimpleTriggerFactoryBean firstJobTrigger(@Qualifier("FirstJobDetail") JobDetail jobDetail,
                                                    @Value("${first.job.frequency}") long frequency) {
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L); // 立即启动
        factoryBean.setRepeatInterval(frequency); // 重复间隔
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); // 无限重复
        return factoryBean;
    }

    @Bean
    public SimpleTriggerFactoryBean secondJobTrigger(@Qualifier("SecondJobDetail") JobDetail jobDetail,
                                                     @Value("${second.job.frequency}") long frequency) {
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setRepeatInterval(frequency);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        return factoryBean;
    }
}

在application.properties或application.yml中配置任务频率:

first.job.frequency=5000 # 5秒
second.job.frequency=10000 # 10秒

4. 更新SchedulerFactoryBean以接收集合

这是实现多任务调度的关键步骤。修改SchedulerFactoryBean的@Bean方法,使其能够自动注入所有类型为JobDetail和Trigger的Bean列表。Spring会自动收集所有定义的JobDetail和Trigger Bean并作为列表注入。

import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

@Configuration
public class SchedulerConfig {

    private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);

    private final ApplicationContext applicationContext;

    public SchedulerConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    // 配置JobFactory,使Quartz能够通过Spring容器实例化Job,并支持Job内部的依赖注入
    @Bean
    public SpringBeanJobFactory jobFactory() {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    // 配置SchedulerFactoryBean,接收JobDetail和Trigger列表
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(List jobDetails, List triggers) throws IOException {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setQuartzProperties(quartzProperties()); // 加载quartz配置
        schedulerFactory.setWaitForJobsToCompleteOnShutdown(true); // 关闭时等待任务完成
        schedulerFactory.setAutoStartup(true); // 自动启动调度器
        schedulerFactory.setJobFactory(jobFactory()); // 设置自定义JobFactory

        // 将所有JobDetail和Trigger转换为数组并设置给调度器
        schedulerFactory.setJobDetails(jobDetails.toArray(new JobDetail[0]));
        schedulerFactory.setTriggers(triggers.toArray(new Trigger[0]));

        LOG.info("Quartz Scheduler configured with {} jobs and {} triggers.", jobDetails.size(), triggers.size());
        return schedulerFactory;
    }

    // 加载Quartz配置属性
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    // ... (JobDetailFactoryBean 和 SimpleTriggerFactoryBean 的定义,如上述步骤2和3所示)
    // 完整的配置示例请参考下面的整合代码块
}

完整配置示例

将上述所有片段整合到一个SchedulerConfig类中,即可形成一个完整的、支持多任务调度的Quartz配置。

import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Job;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

// 任务类定义
class FirstDomainOrgCheckJob implements Job {
    private static final Logger LOG = LoggerFactory.getLogger(FirstDomainOrgCheckJob.class);
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        LOG.info("FirstDomainOrgCheckJob : FirstJob fired at {}", new Date());
    }
}

class SecondDomainOrgCheckJob implements Job {
    private static final Logger LOG = LoggerFactory.getLogger(SecondDomainOrgCheckJob.class);
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        LOG.info("SecondDomainOrgCheckJob : SecondJob fired at {}", new Date());
    }
}

// Quartz调度器配置
@Configuration
public class SchedulerConfig {

    private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);

    private final ApplicationContext applicationContext;

    @Autowired
    public SchedulerConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    /**
     * 配置JobFactory,使Quartz能够通过Spring容器实例化Job,并支持Job内部的依赖注入。
     */
    @Bean
    public SpringBeanJobFactory jobFactory() {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    /**
     * 配置SchedulerFactoryBean,负责协调所有JobDetail和Trigger。
     * Spring会自动收集所有类型为JobDetail和Trigger的Bean并注入到列表中。
     *
     * @param jobDetails 所有JobDetail Bean的列表
     * @param triggers 所有Trigger Bean的列表
     * @return 配置好的SchedulerFactoryBean
     * @throws IOException 如果无法加载quartz属性文件
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(List jobDetails, List triggers) throws IOException {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setQuartzProperties(quartzProperties());
        schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
        schedulerFactory.setAutoStartup(true);
        schedulerFactory.setJobFactory(jobFactory());

        // 将所有JobDetail和Trigger转换为数组并设置给调度器
        schedulerFactory.setJobDetails(jobDetails.toArray(new JobDetail[0]));
        schedulerFactory.setTriggers(triggers.toArray(new Trigger[0]));

        LOG.info("Quartz Scheduler configured with {} jobs and {} triggers.", jobDetails.size(), triggers.size());
        return schedulerFactory;
    }

    /**
     * 定义第一个任务的JobDetail。
     * 使用@Qualifier("FirstJobDetail")指定Bean名称,方便Trigger引用。
     */
    @Bean(name = "FirstJobDetail")
    public JobDetailFactoryBean firstJobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(FirstDomainOrgCheckJob.class);
        jobDetailFactory.setDurability(true); // 即使没有活跃的触发器,JobDetail也会保留
        return jobDetailFactory;
    }

    /**
     * 定义第一个任务的SimpleTrigger。
     * 通过@Qualifier引用FirstJobDetail。
     * 任务频率从配置文件中读取。
     */
    @Bean
    public SimpleTriggerFactoryBean firstJobTrigger(@Qualifier("FirstJobDetail") JobDetail jobDetail,
                                                    @Value("${first.job.frequency}") long frequency) {
        LOG.info("Configuring First Job Trigger with frequency: {}ms", frequency);
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L); // 立即启动
        factoryBean.setRepeatInterval(frequency); // 重复间隔
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); // 无限重复
        return factoryBean;
    }

    /**
     * 定义第二个任务的JobDetail。
     * 使用@Qualifier("SecondJobDetail")指定Bean名称。
     */
    @Bean(name = "SecondJobDetail")
    public JobDetailFactoryBean secondJobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(SecondDomainOrgCheckJob.class);
        jobDetailFactory.setDurability(true);
        return jobDetailFactory;
    }

    /**
     * 定义第二个任务的SimpleTrigger。
     * 通过@Qualifier引用SecondJobDetail。
     * 任务频率从配置文件中读取。
     */
    @Bean
    public SimpleTriggerFactoryBean secondJobTrigger(@Qualifier("SecondJobDetail") JobDetail jobDetail,
                                                     @Value("${second.job.frequency}") long frequency) {
        LOG.info("Configuring Second Job Trigger with frequency: {}ms", frequency);
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setRepeatInterval(frequency);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        return factoryBean;
    }

    /**
     * 从quartz.properties文件加载Quartz的额外配置。
     */
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
}

quartz.properties 示例:

org.quartz.scheduler.instanceName=MyScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.threadCount=10
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

application.properties 示例:

first.job.frequency=5000
second.job.frequency=10000

注意事项与最佳实践

  1. JobFactory的重要性:AutowiringSpringBeanJobFactory是确保Quartz能够正确创建Spring管理Job实例的关键。如果Job类内部需要注入其他Spring Bean,必须配置此JobFactory。
  2. @Qualifier的使用:当有多个相同类型的Bean(如多个JobDetail或Trigger)时,使用@Qualifier注解可以明确指定要引用的特定Bean,避免歧义。
  3. 外部化配置:将任务的调度频率、延迟等参数通过@Value注解从配置文件中读取,可以提高配置的灵活性和可维护性。
  4. 日志记录:在Job的execute方法中添加适当的日志,有助于监控任务的执行情况和调试问题。
  5. 触发器类型选择
    • SimpleTriggerFactoryBean适用于简单的重复调度,例如每隔N秒执行一次。
    • CronTriggerFactoryBean适用于更复杂的调度,例如每天凌晨1点、每周一上午9点等,通过Cron表达式定义。如果您的任务需要更复杂的调度规则,可以将其替换为CronTriggerFactoryBean。
  6. 错误处理:在Job的execute方法中,应包含健壮的错误处理逻辑,例如try-catch块,以防止单个任务失败影响整个调度器的运行。
  7. 集群环境:对于生产环境,特别是集群部署,可能需要配置Quartz的数据库持久化(JDBCJobStore)来确保任务的可靠性和容错性。这涉及到在quartz.properties中配置数据源和相关的JobStore属性。

总结

通过本教程,我们学习了如何在Spring Boot中优雅地配置和管理多个Quartz定时任务。关键在于为每个任务定义独立的JobDetail和Trigger Bean,并利用Spring的依赖注入机制,让SchedulerFactoryBean自动收集并注册这些任务和触发器。这种模式不仅清晰、易于理解,而且具有良好的可扩展性,使得添加新的定时任务变得非常简单。遵循这些最佳实践,可以构建出健壮且易于维护的定时任务调度系统。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。