任务调度功能实现

一.引入依赖

因为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();
            }
        }
    }
相关推荐
杜 硕4 小时前
从零开始的C++生活——第六讲——01
开发语言·c++·生活
淡漠的蓝精灵4 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
乌暮4 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
学长毕设4 小时前
基于SpringBoot的烘焙商品商品系统-附源码
java·spring boot·后端
এ慕ོ冬℘゜5 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼5 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区5 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
howard20055 小时前
英中 / 中英对照制作程序:操作指南
spring boot·bootstrap·thymeleaf·操作指南·对照制作程序
金銀銅鐵5 小时前
[Java] 用纯 Swing 做一个《論語·學而》阅读器
java·ai编程·交互设计
艾伦_耶格宇6 小时前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes