精华内容
下载资源
问答
  • <div><p>尊敬的开发者,您好,本人以管理员权限运行WGestures,...但过一会就无法使用了,望作者大大修复此bug,谢谢</p><p>该提问来源于开源项目:yingDev/WGestures</p></div>
  • 本文学习思路:Linux的corntab定时任务使用教程 -->定时任务无效的解决方案 Linux的corntab定时任务使用教程 1. 首先,输入命令打开crontab定时任务设置  crontab -e 2. 然后,按 i键进入编辑状态。...

     前言

    本文学习思路:Linux的corntab定时任务的使用教程  --> 定时任务无效的解决方案

     Linux的corntab定时任务的使用教程

    1. 首先,输入命令 打开crontab定时任务设置  

    crontab -e

    2. 然后,按 i 键进入编辑状态。将光标移动到最后一行。

    2.1. crontab 任务格式如下:

    minute hour day month week order

    2.1.2 例子:

    2.1.2.1.  假如我想每隔2分钟就执行一次pwd命令。那么格式如下:(*代表任意时间都成立, 除以2表示间隔为2)

    */2  *  *  *  *  pwd
    

    2.1.2.2.  假如我想每隔3小时就执行一次pwd命令。那么格式如下:

    0  */3  *  *  *  pwd
    

    2.1.2.3.  假如我想每天的6点30分执行一次pwd命令。那么格式如下:

    30  6  *  *  *  pwd

    2.1.2.4.  故,下面我要每隔2分钟执行一次python脚本hello.py。那么格式如下(我的python在 /usr/bin/python)

    */2 * * * * /usr/bin/python /myfiles/hello.py

    3. 在vim下按格式输入定时任务后,按Esc,输入wq保存退出。

    4. 最后,视情况重启crontab服务

    4.1. centos:

    service crond start //启动服务
    service crond stop //关闭服务
    service crond restart //重启服务

    4.2. ubuntu:

    /etc/init.d/cron stop
    /etc/init.d/cron start
    

      

    4.3. 假如以上两种方法都无效,说明你当前的Linux系统是自动生效的。(一般是即时生效、无须重启)

     

     定时任务无效的解决方案

    终于到本文最激动的片段啦。因为下面的内容是经过我很多次折腾总结的。希望其中的一条能帮到你,帮你偷偷懒。

    1. 我想定时执行ls命令,如" ls -l / ", 且我的命令如下,我感觉是对的,但就是没有work。

    */10 * * * * ls -l /

    解决方案:有可能crontab无法读取环境变量或环境变量异常,所以写ls的绝对路径是最稳妥的。也就是将ls 改为 /usr/bin/ls。如下:

    */10 * * * * /usr/bin/ls -l /

     

    2. 我的命令已经是绝对路径,但是python脚本在crontab还是无法定时执行。或者,我在命令行下是正常的,但是在crontab中无效。

    */2 * * * * /usr/bin/python /myfiles/hello.py

    解决方案:有可能你的hello.py文件没有被执行的权限。所以只要帮hello.py加一个权限就好啦。

    chmod +x hello.py
    

     

    以上两种问题,是目前大多博文出现的问题,而且也经过我偷懒人自身的经历,确实是如此。

    希望以上内容可以帮助各位老哥们在crontab的使用和问题解决上有所帮助。

     

     

    本文博客地址:http://www.cnblogs.com/toulanboy/

    原创文章,转载请注明出处。

    转载于:https://www.cnblogs.com/toulanboy/p/7754423.html

    展开全文
  • 在其他博文里看到很多方法,没有一个可以解决此问题的,终于找到一个方法可以解决,至少我的电脑是这样的,我感觉这个和电脑的系统有关系。在此记录一下。 1.点击此电脑,右击点击管理。 ......

    在其他博文里看到很多方法,没有一个可以解决此问题的,终于找到一个方法可以解决,至少我的电脑是这样的,我感觉这个和电脑的系统有关系。在此记录一下。

    1.点击此电脑,右击点击管理。

    2.跳到此页面点击服务。

    3.在右边找黄色标记的服务,看这个服务是不是开启,我的不是开启,只要右击点击属性,将其激活即可。

    4.搜索成功。

     

    展开全文
  • 解决使用@Scheduled创建任务无法在同一时间执行多个任务的BUG   最近在项目中需要任务调度框架,正好springboot集成了一个简单定时调度,而且我们项目功能比较简单就没必要引入Quartz这种比较大型的框架。但是...

    解决使用@Scheduled创建任务时无法在同一时间执行多个任务的BUG 

           最近在项目中需要任务调度框架,正好springboot集成了一个简单定时调度,而且我们项目功能比较简单就没必要引入Quartz这种比较大型的框架。但是在使用的过程中测试人员发现如果多个任务设计同一时间执行会出现只有一个任务在执行其它任务都无法执行的情况。因为问题比较严重就专门研究了一翻,发现问题还真存在。以下是测试流程:

    1.新建个测试类,里面定义2个方法execute1和execute2。两个方法里面没有任何操作只打印当前时间和线程名,为了模拟线上的情况让该方法运行的时候sleep 1秒再结束(业务操作需要耗费一定的时间)。

    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    
    @Component
    public class MyScheduled {
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void execute1(){
            String curName = Thread.currentThread().getName() ;
            System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute1对应的线程名: "+curName);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void execute2(){
    
            String curName = Thread.currentThread().getName() ;
            System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    *因为项目使用的是springboot框架为了让定时任务生效需要在类上面加上@EnableScheduling以开启对定时任务的支持

    按正常的理解此时运行exect1和execute2打印的线程名应该不一致才对,但是测试的结果让人大跌眼镜。以下是本地的运行结果:

     

    当前时间:2018-08-26T10:53:40.123  任务execute1对应的线程名: pool-1-thread-1
    当前时间:2018-08-26T10:53:41.127  任务execute2对应的线程名: pool-1-thread-1
    当前时间:2018-08-26T10:53:45.014  任务execute2对应的线程名: pool-1-thread-1
    当前时间:2018-08-26T10:53:46.028  任务execute1对应的线程名: pool-1-thread-1
    当前时间:2018-08-26T10:53:50.016  任务execute2对应的线程名: pool-1-thread-1
    当前时间:2018-08-26T10:53:51.029  任务execute1对应的线程名: pool-1-thread-1

    可以发现正如测试同事说的那样,同一时间间隔的2个定时任务(都设置了5秒运行一次)只会运行一个,并且神奇的一点时线程名字是一样的。因此有理由怀疑springboot创建线程的时使用了newSingleThreadExecutor。带着这个疑问,我们只能一步步来debug了,我们首先在execute1方法中打个断点看下调用类和线程池看下是什么情况。

    通过上图我们可以发现springboot创建的线程池poolSize确实是1,当前活动线程数(activethreads)为1。我们继续往下跟踪,首先我们从@EnableScheduling这个注解开始跟踪。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Import({SchedulingConfiguration.class})
    @Documented
    public @interface EnableScheduling {
    }

    可以看到EnableScheduling是将SchedulingConfiguration这个类实例化并注入到springboot容器中,我们继续跟踪下去看下改配置类执行什么操作。

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.scheduling.annotation;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Role;
    
    @Configuration
    @Role(2)
    public class SchedulingConfiguration {
        public SchedulingConfiguration() {
        }
    
        @Bean(
            name = {"org.springframework.context.annotation.internalScheduledAnnotationProcessor"}
        )
        @Role(2)
        public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
            return new ScheduledAnnotationBeanPostProcessor();
        }
    }

    可以看出里面注入了org.springframework.context.annotation.internalScheduledAnnotationProcessor这个类(*这里发现一个@Role(2)注解,没找到这个注解到底实现什么功能)

    然后在springboot的API中查找下这个类到底实现什么功能http://fanyi.baidu.com/transpage?from=auto&to=zh&query=https%3A%2F%2Fdocs.spring.io%2Fspring-framework%2Fdocs%2Fcurrent%2Fjavadoc-api%2Forg%2Fspringframework%2Fscheduling%2Fannotation%2FScheduledAnnotationBeanPostProcessor.html&source=url&ie=utf8&render=1&aldtype=16047(英文不好这里只好使用百度翻译一下)

    大概的意思是如果没有指定TaskScheduler则会创建一个单线程的默认调度器。因此问题就清楚了,需要自己创建一个TaskScheduler。立马百度一下,发现很简单

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

    只需要把这一段代码放进启动类即可。我这边为了方便就直接放进MySchedule类里面,修改后的代码为:

    import org.springframework.context.annotation.Bean;
    import org.springframework.scheduling.TaskScheduler;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    
    @Component
    @EnableScheduling
    public class MyScheduled {
    
        @Bean
        public TaskScheduler taskScheduler() {
            ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
            taskScheduler.setPoolSize(50);
            return taskScheduler;
        }
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void execute1(){
            String curName = Thread.currentThread().getName() ;
            System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute1对应的线程名: "+curName);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void execute2(){
    
            String curName = Thread.currentThread().getName() ;
            System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

     

    我们再次测试下效果:

    当前时间:2018-08-26T12:09:50.010  任务execute2对应的线程名: taskScheduler-1
    当前时间:2018-08-26T12:09:50.010  任务execute1对应的线程名: taskScheduler-2
    当前时间:2018-08-26T12:09:55.001  任务execute1对应的线程名: taskScheduler-3
    当前时间:2018-08-26T12:09:55.001  任务execute2对应的线程名: taskScheduler-1
    当前时间:2018-08-26T12:10:00.017  任务execute2对应的线程名: taskScheduler-2
    当前时间:2018-08-26T12:10:00.018  任务execute1对应的线程名: taskScheduler-4
    当前时间:2018-08-26T12:10:05.001  任务execute1对应的线程名: taskScheduler-3
    当前时间:2018-08-26T12:10:05.001  任务execute2对应的线程名: taskScheduler-1

    发现线程名变了,因此问题得到了完美解决。后来继续debug发现ScheduledTaskRegistrar 里面有这么一行代码

    可以发现当taskScheduler对象为空时默认创建的是newSingleThreadScheduledExecutor()  至此问题解决。但是还有以下2个问题后续有空需要继续研究

    1.springboot为啥默认创建的是newSingleThreadScheduledExecutor?

    2.@Role注解到底有什么用处

     

           经过这一折腾,感觉自己对springboot的理解还不够深入,希望在项目中一边踩坑一边研究。后期打算集成quartz+mysql+ZK实现高可用的任务调度,当然这是后话目前还是先把项目做好!

    展开全文
  • 配置: 1、开启注解调度支持 spring在配置文件中添加 <task:annotation-driven /> <!--开启注解调度支持 @Scheduled -->...@EnableScheduling//开启定时任务 @MapperScan("xxx.xxx.mapper")

    配置:
    1、开启注解调度支持
    spring在配置文件中添加 <task:annotation-driven />

    <!--开启注解调度支持 @Scheduled -->  
    	<task:annotation-driven />
    

    2、springBoot可以直接在启动类上添加注解 @EnableScheduling

    @SpringBootApplication
    @EnableScheduling//开启定时任务
    @MapperScan("xxx.xxx.mapper")
    public class XXXApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(XXXApplication .class, args);
        }
    }
    

    使用:
    然后编写任务类,并在任务类中编写定时任务的方法,记得添加@Component注解交由spring管理

    @Component
    public class testTask {
        
        public void doTask() {
            System.out.println("开始执行定时任务");
        }
    }
    

    接着,使用cron表达式标注任务方法

    @Component
    public class testTask {
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void doTask() {
             System.out.println("开始执行定时任务");
        }
    }
    

    cron
    下面介绍关于cron表达式的使用方式
    按顺序依次为
    1 秒(0~59)
    2 分钟(0~59)
    3 小时(0~23)
    4 天(0~31)
    5 月(0~11)
    6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
    7.年份(1970-2099)
    其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
    0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
    0 0 12 ? * WED 表示每个星期三中午12点
    “0 0 12 * * ?” 每天中午12点触发
    “0 15 10 ? * *” 每天上午10:15触发
    “0 15 10 * * ?” 每天上午10:15触发
    "0 15 10 * * ? " 每天上午10:15触发
    “0 15 10 * * ? 2005” 2005年的每天上午10:15触发
    “0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
    “0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
    “0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
    “0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
    “0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
    “0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
    “0 15 10 15 * ?” 每月15日上午10:15触发
    “0 15 10 L * ?” 每月最后一日的上午10:15触发
    “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
    “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
    “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
    有些子表达式能包含一些范围或列表
    例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
    ”字符代表所有可能的值
    “/”字符用来指定数值的增量
    例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
    在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
    “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
    当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
    “L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
    如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天
    注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
    W 字符代表着平日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。
    例如,日域中的 15W 意味着 “离该月15号的最近一个平日。” 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一离15号更近。
    C:代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
    字段 允许值 允许的特殊字符
    秒 0-59 , - * /
    分 0-59 , - * /
    小时 0-23 , - * /
    日期 1-31 , - * ? / L W C
    月份 1-12 或者 JAN-DEC , - * /
    星期 1-7 或者 SUN-SAT , - * ? / L C #
    年(可选) 留空, 1970-2099 , - * /

    都差不多,没有的可以到这里 在线生成 https://cron.qqe2.com
    使用中遇到的坑
    L表示最后,比如 @Scheduled(cron= “0 45 23 L * ?”) 表示没月的最后一天的23:45执行
    项目中使用的springBoot为2.1.8不支持L W C 这样的表达式,会报错

    Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'insterIntoConsumption': For input string: "L"
    	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:496)
    	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.lambda$null$1(ScheduledAnnotationBeanPostProcessor.java:359)
    	at java.lang.Iterable.forEach(Iterable.java:75)
    	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.lambda$postProcessAfterInitialization$2(ScheduledAnnotationBeanPostProcessor.java:359)
    	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:358)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:429)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
    
    

    解决
    业务需要如此,那就要变通了
    1、每月最后一天不能,可以改为每月第一天凌晨执行
    2、用定时策略+if判断来执行

    @Scheduled(cron = "0 15 10 28-31 * ?")
    public void execute() {
    	final Calendar c = Calendar.getInstance();
    	if (c.get(Calendar.DATE) == c.getActualMaximum(Calendar.DATE)) {
    //是最后一天
    	System.out.println("执行任务");
    	}
    }
    

    3、更换spring版本,额,这个不推荐

    展开全文
  • 定时任务无法使用guzzle发送一个http post请求,并且日志没有报错 <p><strong>Screenshots <img alt="image" src="https://img-blog.csdnimg.cn/img_convert/228e00f35575aaef41c84dc9f41cf857.png" /></p...
  • 主要介绍了SpringBoot项目使用多线程处理任务无法通过@Autowired注入bean问题的解决方法,需要的朋友可以参考下
  • 解决IE8开发工具最小化在任务无法使用问题,经常使用IE8开发工具的开发人员可能会遇到这么一种去情况:按F12时任务栏里出现开发人员工具的任务,但是开发人员工具窗体不弹出,也不出现在IE8 里,重装IE88后还是...
  • 无法使用任务管理器的解决方法1.检查 c:/windows/system32 或 c:/winnt/system32 下是否有名为taskmgr.exe的文件如果没有,请从其它使用同一版本Windows的电脑中复制一个过来 2.用 c:/windows/system32/SIGVERIF....
  • 问题:使用定时器定义Job时需要使用RedisTemplate对象来操作Redis,一般情况下的使用方式为: package com.nys.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz....
  • Spring配置文件中需要配置的内容: xmlns:task="http://www.springframework.org/schema/task" ... 配...
  • Celery使用方法灵活,根据具体业务有不同的部署和使用方法,经常会遇到的一个问题:在使用命令启动Celery时,任务没有注册或其它错误,导致无法正常调用Celery,这里举例几种常见的情况,说明错误和解决方案,供...
  • win7下计划任务schtasks使用详解及"错误:无法加载列资源"的解决方法 schtasks 命令简述: 安排命令和程序,使其定期运行或在指定时间运行。向计划中添加任务和从中删除任务、根据需要启动和停止任务以及显示和...
  • 任务栏管理器无法结束任务 ...解决结束任务无法结束,拒绝访问。 2、使用pchunter1.57加载驱动失败,宣告pchunter方式失败(windows7的朋友可以试试,有可能可以用此方法) 3、使用管理员权限运行cmd,然后t
  • @EnableScheduling @Configuration @EnableDiscoveryClient @EnableFeignClients @EnableCaching public class Application extends DefaultApplication { /** * *〈简述〉修复同一时间无法执行多个 定时任务问题 *...
  • 写了一个shell脚本,在终端测试可以正常运行,但是加入到crontab任务里却无法执行。在网上找了一下解决方法,大都是说因为环境问题,可是操作一通后发现并不能解决我的问题。很奇怪:其他shell脚本可以在crontab里...
  • 手贱在笔记本上装了directx sdk 10,第二天启动就不能...百度问题。 解决:因为这个安全模式卸载不了d3dsdk 就只能重装显卡驱动,到系统,设备管理器中把两个显卡都卸载了,然后就重启。最后重新安装显卡驱动。。。
  • ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出 搜索了好久 终于找到了解决方法。 任务栏不是出现那个箭头么,点击后没反应是吧 在缩略图上点右键-最大化,然后就出来了, ctrl+p肯定可以...
  • 使用Quartz.net每天定时执行某个任务时,未能正常执行,每次在本地测试时,设置了短的时间间隔,都能正常执行任务,但是挂到服务器后,设置定时执行时间为几个小时,却不能正常执行我们要执行的操作。 原 因: IIS...
  • 需求是做定时任务推送消息或者修改状态,springBoot中在多线程中为了线程安全,一般都是防止注解注入的,新线程中@Autowired注解无法注入需要的bean(即:保存历史数据的service层),程序一直在报 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,523
精华内容 3,409
关键字:

任务无法使用