写了一个Flink程序, 加载spring, 运行定时任务,
public class LoopSource implements SourceFunction<String> {
@Override
public void run(SourceContext<String> 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<String> {
@Override
public void run(SourceContext<String> 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();
}
}