体检管理系统——定时清理文件系统服务器图片功能

	在新增套餐时套餐的基本信息和图片是分两次提交到后台进行操 作的。也就是用户首先将图片上传到七牛云服务器,然后再提交新增窗口中录入的其他信息。如果用户 只是上传了图片而没有提交录入的其他信息,此时的图片就变为了垃圾图片,因为在数据库中并没有记 录它的存在。此时我们要如何处理这些垃圾图片呢?

解决方案就是通过定时任务组件定时清理这些垃圾图片。为了能够区分出来哪些图片是垃圾图片,我们 在文件上传成功后将图片保存到了一个redis集合中,当套餐数据插入到数据库后我们又将图片名称保存 到了另一个redis集合中,通过计算这两个集合的差值就可以获得所有垃圾图片的名称。 本章节我们就会基于Quartz定时任务,通过计算redis两个集合的差值找出所有的垃圾图片,就可以将 垃圾图片清理掉。

	redis中获取两个集合的差集,遍历差集,调用API完成图片的删除,还得将删除后的图片名称从集合中移除掉。

操作步骤:
(1)创建maven工程health_jobs,打包方式为war,导入Quartz等相关坐标
health_jobs
war

live.longmarch health_interface 1.0-SNAPSHOT org.quartz-scheduler quartz org.quartz-scheduler quartz-jobs

(2),配置web.xml

contextConfigLocation classpath*:applicationContext*.xml org.springframework.web.context.ContextLoaderListener

(3),编写任务类
/**

  • 自定义Job,实现定时清理垃圾图片
    */
    public class ClearImgJob {
    @Autowired
    private JedisPool jedisPool;
    public void clearImg(){
    //根据Redis中保存的两个set集合进行差值计算,获得垃圾图片名称集合
    Set set = jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES,RedisConstant.SETMEAL_PIC_DB_RESOURCES);
    if(set != null){
    for (String picName : set) {
    //删除七牛云服务器上的图片
    QiniuUtils.deleteFileFromQiniu(picName);
    //从Redis集合中删除图片名称
    jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES,picName);
    System.out.println(“自定义任务执行,清理垃圾图片:” + picName);
    }
    }
    }
    }

(4),配置applicationContext-jobs.xml

<!--开启spring注解使用-->
   <context:annotation-config></context:annotation-config>
   
   <!--注册自定义Job-->
   <bean id="clearImgJob" class="com.itheima.jobs.ClearImgJob"></bean>
​
   <bean id="jobDetail"
         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <!-- 注入目标对象 -->
       <property name="targetObject" ref="clearImgJob"/>
       <!-- 注入目标方法 -->
       <property name="targetMethod" value="clearImg"/>
   </bean>
   <!-- 注册一个触发器,指定任务触发的时间 -->
   <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
       <!-- 注入JobDetail -->
       <property name="jobDetail" ref="jobDetail"/>
       <!-- 指定触发的时间,基于Cron表达式 -->
       <property name="cronExpression">
           <!--
           <value>0 0 2 * * ?</value>
           -->
           <value>0/10 * * * * ?</value>
       </property>
   </bean>
   <!-- 注册一个统一的调度工厂,通过这个调度工厂调度任务 -->
   <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       <!-- 注入多个触发器 -->
       <property name="triggers">
           <list>
               <ref bean="myTrigger"/>
           </list>
       </property>
   </bean>

(5),配置 applicationContext-redis.xml

<!--Jedis连接池的相关配置-->
   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
       <property name="maxTotal">
           <value>200</value>
       </property>
       <property name="maxIdle">
           <value>50</value>
       </property>
       <property name="testOnBorrow" value="true"/>
       <property name="testOnReturn" value="true"/>
   </bean>
   <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
       <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
       <constructor-arg name="host" value="127.0.0.1" />
       <constructor-arg name="port" value="6379" type="int" />
       <constructor-arg name="timeout" value="30000" type="int" />
   </bean>

完成定时文件系统服务器清理图片

发布了71 篇原创文章 · 获赞 1 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/weixin_44993313/article/details/103747443