[记录]Flink中取消job时没有关闭springApplication

写了一个Flink程序, 加载spring, 运行定时任务,

public class LoopSource implements SourceFunction {
    @Override
    public void run(SourceContext ctx) throws Exception {
        try {
            //这句代码会加载spring
            Class.forName(SpringContextUtils.class.getName());
        } catch (ClassNotFoundException e) {
            LOGGER.error("", e);
        }
        while(true) {
            TimeUnit.MINUTES.sleep(1);
            ctx.collect("我是帅哥");
        }
    }

    @Override
    public void cancel() {
    }
}

定时任务正常运行, 但是在取消掉job后发现定时任务仍然在运行.
(猜测: 取消任务并不会导致容器关闭, 已经加载的类也不会销毁, 定时任务当然不会停止, 更进一步原因以后有时间分析一下)
解决方案: 取消job时销毁spring.

public class LoopSource implements SourceFunction {
    @Override
    public void run(SourceContext ctx) throws Exception {
        try {
            //这句代码会加载spring
            Class.forName(SpringContextUtils.class.getName());
        } catch (ClassNotFoundException e) {
            LOGGER.error("", e);
        }
        while(true) {
            TimeUnit.MINUTES.sleep(1);
            ctx.collect("我是帅哥");
        }
    }

    @Override
    public void cancel() {
        /**
         * 注意这一步很重要,关闭springApplication, 不然cancel Job不会停止定时任务
         */
        SpringContextUtils.shutdown();
    }
}

你可能感兴趣的:([记录]Flink中取消job时没有关闭springApplication)