记录ScheduledExecutorService使用中不工作情况

本文原地址来自于我的个人博客:www.endless365.com,希望得到各位的关注。

本文详细地址出自于:http://www.endless365.com/article/get?type=tec&id=154

由于本博客存在一个自己的IP统计功能,使用了淘宝API查询IP的归属地,由于淘宝API查询IP归属地存在访问速度限制问题,导致本博客在插入用户记录的时候查询归属地特别的慢,所有考虑使用多线程去处理,但是写了代码以后才发现我的阿里云服务器是单核的,多线程好像没什么卵用,好吧,又想了一想,考虑使用一个定时器在晚上某个时候执行。接下来问题就出来了。。。

先上我的代码:

ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
        schedule.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                try {
                    System.out.println("into updateUserActivityIP=========="+DateTool.getCurrentTimeCN());
                    userActivityService.updateAllUserActivity();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, 0, 30, TimeUnit.MINUTES);

当启动tomcat服务器以后,每隔30分钟执行一次更新user activity记录中ip归属地的信息,在测试的过程中发现,into updateUserActivityIP的打印每次都只执行了一次,这个郁闷啊,查来查去找不到问题的原因。然后就另外写了一个定时器的demo

/**
 *
 * @author sunny
 */
public class ScheduleTest {
    public static int i=0;
    public static void main(String[] args) {
        ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
        pool.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                try {
                    i++;
                    System.out.println("i="+i);
                } catch (Exception ex) {
                    Logger.getLogger(ScheduleTest.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1, 1, TimeUnit.SECONDS);
    }
}

发现这个Demo没有任何的问题,好吧,只能去查查JDK的API看在什么情况下会导致ScheduledExecutorService不工作。发现JDK中有这么一段话。

QQ截图20151217092815.jpg

如果任务的任意执行遇到异常,就会取消后续执行。

这句话非常重要,也给了我解决问题的思路。那肯定是我的run方法里面的代码报错了,但是我又没有看见后台有报错,只要设置一个线程默认未捕获异常的处理handler。

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                e.printStackTrace();
            }
        });

该代码放置在线程开启前面。再次运行以后,果断发现了问题。

原来是Hibernate里面session中事务导致报错的问题,错误如何处理就不详细讲了,解决报错之后,代码就能够正常运行。

以上文章由于记录处理这个bug的思路和解决方案。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Spring BootScheduledExecutorService是一个Java定时器工具类,可以用于在Spring Boot应用程序启动时启动和运行任务。你可以使用自定义的定时器工具类,结合Spring Boot一起使用。另外,你也可以使用ScheduledExecutorService接口提供的方法来创建一个定时任务执行线程池。例如,在Spring Boot,你可以通过@Bean注解来创建一个ScheduledExecutorService实例,并将其注入到需要使用的地方。这样,你就可以使用这个线程池来执行周期性的定时任务。如果在Spring Boot找不到默认的ScheduledExecutorService实例,系统将会抛出NoSuchBeanDefinitionException异常,并打印出相应的错误信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [自定义Java-ScheduledExecutorService定时器.jar](https://download.csdn.net/download/wsk1103/10230495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [scheduledexecutorservice 的使用_SpringBoot @Schedule使用注意与原理](https://blog.csdn.net/weixin_39574869/article/details/110998360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [spring boot.定时任务问题记录(TaskScheduler/ScheduledExecutorService异常)](https://blog.csdn.net/acj2008/article/details/101941093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值