任务调度功能实现

一.引入依赖

因为springboot中包含了spring Task框架,所以spring boot项目不需要引入依赖

二.在启动类上添加@EnableScheduling注解

三.在方法上加入@Scheduled(cron = "*/1 * * * * ?")实现的任务调度

复制代码
@Service
@Slf4j
public class TaskServiceImpl implements TaskService {
    @Autowired
    private RedisService redisService;
    @Autowired
    ComfyuiApi comfyuiApi;
    @Override
    public void addQueueTask() {
        ComfyuiTask queueTask = redisService.getQueueTask();
        if (queueTask == null) {
            return;
        }
        try {
            Response<HashMap> response = comfyuiApi.addQueueTask(queueTask.getComfyuiRequestDto()).execute();
            if(response.isSuccessful()){
                log.info("任务添加成功:{}", response.body());
                Object o = response.body().get("prompt_id");
                queueTask.setPromptId(o.toString());
            }else{
                log.error("任务添加失败:{}", response.errorBody());
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("任务添加失败:{}", e.getMessage());
        }
    }
    @Scheduled(cron = "*/1 * * * * ?")
    public void task(){
        addQueueTask();
    }
}

四.处理多集群问题-----分布式锁

因为多个处理器中同时队comfyui发送请求,就炸了,因为comfyui只能一次处理一个文生图请求

1.配置Redission

<1>配置Reddisonclient

<2>配置StringReidsTemplate连接工厂

复制代码
@Configuration
public class RedissonConfig {
    //配置redissonclient
    @Bean
    public RedissonClient redissonConfig(RedisProperties redisProperties){
        Config config = new Config();
        config.useSingleServer().setAddress(String.format("redis://%s:%s",redisProperties.getHost(),redisProperties.getPort()));
        return Redisson.create(config);
    }
    //配置stringRedisTemplate
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisProperties redisProperties){
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisProperties.getHost(),redisProperties.getPort());
        lettuceConnectionFactory.start();
        return new StringRedisTemplate(lettuceConnectionFactory);
    }
}

2.上锁

复制代码
@Scheduled(cron = "*/1 * * * * ?")
    public void task(){
        RLock lock = redissonClient.getLock(Lock_KEY);
        if(lock.tryLock()){
            try {
                log.info("添加锁成功");
                addQueueTask();
            } finally {
                lock.unlock();
            }
        }
    }
相关推荐
「QT(C++)开发工程师」4 小时前
C++ 11 常用for循环
开发语言·c++
我还记得那天4 小时前
0 初识C++
开发语言·c++
FfHUCisI4 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI4 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
秋饼5 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长5 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk5 小时前
ObjectProperty
java·开发语言·算法
大模型码小白6 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
hh9506 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区