quartz执行卡死--强制中断线程
在quartz中经常会碰到由于网络问题或者一些其他不稳定因素导致的线程卡死问题,这往往会导致数据处理的延时。而有时候一时无法定位到卡死的原因,为了降低系统风险,我们就会希望有一个超时机制,当执行超时时强制中断该操作。下面就举个例子,ftp协议不稳定,当连接ftp上传下载数据时有时候会遇到不可知的因素会导致卡死,比如说主动被动切换,服务器连接数满等等,现在我们使用java提供的动态代理以及Future的超时机制来解决延时问题。代码如下:
public class FtpClientProxy implements InvocationHandler {
private static ExecutorService executor = Executors.newCachedThreadPool();
private FtpClient target;
private static String interceptorNames="uploadFile,chdir,listFiles,downloadFile,existDir,mkdir,rename";
private static final String THREAD_TIMEOUT_CONFIG="THREAD_TIMEOUT_CONFIG";
private static final String METHOD_INTERCEPTOR_CONFIG="METHOD_INTERCEPTOR_CONFIG";
private static int threadTimeout=7200;
private static final Logger logger=Logger.getLogger(FtpClientProxy.class);
/**
* 创建一个新的实例 FtpClientProxy.
*/
public FtpClientProxy() {
try {
String timeoutConfig=UspcUtil.getSysConfigValue(THREAD_TIMEOUT_CONFIG);
if(StringUtils.isNotBlank(timeoutConfig)){
threadTimeout=Integer.parseInt(timeoutConfig);
}
interceptorNames=UspcUtil.getSysConfigValue(METHOD_INTERCEPTOR_CONFIG);
} catch (Exception e) {
logger.error("获取超时配置THREAD_TIMEOUT_CONFIG出错",e);
}
}
/**
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
Object result = null;
String methodName=method.getName();
if(StringUtils.isNotBlank(interceptorNames)&&interceptorNames.contains(methodName)){
Future<Object> future = executor.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
logger.debug(method.getName()+"代理方法执行开始");
return method.invoke(target, args);
}
});
try {
result = future.get(threadTimeout, TimeUnit.SECONDS);
logger.debug(methodName+"代理方法执行结束");
} catch (TimeoutException e) {
logger.error("执行方法"+methodName+"超时",e);
future.cancel(true);
throw new Exception("执行方法"+methodName+"超时");
} catch (Exception e) {
future.cancel(true);// 中断执行此任务的线程
throw new Exception(e);
}
}else{
result=method.invoke(target, args);
}
return result;
}
/**
* 绑定委托对象并返回一个代理类
*
* @param target
* @return
*/
public FtpClient bind(FtpClient target) {
this.target = target;
// 取得代理对象
return (FtpClient) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass()
.getInterfaces(), this);
}
}
可以按照配置的时间来进行超时判断,也可以配置拦截的方法。
quartz执行卡死--强制中断线程的更多相关文章
- linux中断线程化分析【转】
转自:http://blog.csdn.net/qq405180763/article/details/24120895 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在为3.8版本的Li ...
- c# Thread——1.为什么Abort中断线程是不可靠的
Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印. class Program { sta ...
- 记一个实时Linux的中断线程化问题
背景 有一个项目对实时性要求比较高,于是在linux内核上打了RT_PREEMPT补丁. 最终碰到的一个问题是,芯片本身性能不强,CPU资源不足,急需优化. 初步分析 看了下cpu占用率,除了主应用之 ...
- 基于 Quartz.NET 实现可中断的任务
基于 Quartz.NET 实现可中断的任务 Quartz.NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET 允许开发 ...
- java 中断线程的几种方式 interrupt()
中断 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显 ...
- 如何实现Android 中断线程的处理
我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...
- Android 中断线程的处理
我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...
- Java 并发 中断线程
Java 并发 中断线程 @author ixenos 对Runnable.run()方法的三种处置情况 1.在Runnable.run()方法的中间中断它 2.等待该方法到达对cancel标志的测试 ...
- Java线程中断机制-如何中断线程
介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...
- java--- 使用interrupte中断线程的真正用途
Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...
随机推荐
- 超越datetime:Arrow,Python中的日期时间管理大师
介绍 Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建.操作.格式化和转换日期.时间和时间戳.它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块AP ...
- 日志之log4j2和springboot
log4j2比logback好用. 现在之所有以spring采用logback,根据我个人的理解应该是某种非常特殊的理由.否则log4j2的性能比logback更好,且异步性能极好! 异步日志是log ...
- Linux系统用户组管理
用户管理 和Windows一样在Linux中也存在许多用户,可以登陆Linux,和Windows不同的是,在Windows中同一时刻只可以存在一个用户登录系统,而在Linux中是允许多个用户同时登 ...
- 有手就会的 Java 处理压缩文件
@ 目录 前言 背景 第一步:编写代码 1.1 请求层 1.2 业务处理层 1.3 新增配置 第二步:解压缩处理 2.1 引入依赖 2.2 解压缩工具类 总结 前言 请各大网友尊重本人原创知识分享,谨 ...
- github中的子模块(git submodule)
git中支持引用另外一个开源库,并且可以指定依赖的分支或者提交记录号. 比如fltk-rs 库的fltk-sys模块依赖了库 cfltk 并指明了依赖的提交是 8a56507 甚至可以嵌套,毕竟库自身 ...
- DarkHole_1靶机渗透流程
VulnHub_DarkHole1靶机渗透流程 注意:部署时,靶机的网络连接模式必须和kali一致,让靶机跟kali处于同一网段,这用kali才能扫出靶机的主机 1. 信息收集 1.1 探测IP 使用 ...
- 洛谷P1378
这道题需要处理的信息比较多,需要注意的是一个油滴扩展后可能会包含其他的点 #include <iostream> #include <utility> #include < ...
- Swift开发基础02-流程控制
if-slse let age = 4 if age >= 22 { print("Get married") } else if age >= 18 { print( ...
- [oeasy]python0011_ 字符序号_ordinal_ord
序号(ordinal) 回忆上次内容 hello world 不是从来就有的 来自于unix和c 虽然我们今天有各种先进的学习手段 最早的高级语言学习是从最早的那张打字机用纸 ...
- 深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
深入理解Spring Boot:Bean管理.原理解析与Maven高级应用 前言 大家好,今天我们来聊聊Spring Boot的核心内容,包括Bean管理.Spring Boot的工作原理以及Mave ...