在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); } }
可以按照配置的时间来进行超时判断,也可以配置拦截的方法。
相关推荐
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
quartz-all-1.6.3.jar
quartz-2.4.0-SNAPSHOT-distribution.tar.gz包,解压后可查看里面的simple
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
quartz-all-1.6.1-RC3.jar
quartz-all-1.8.6.jar
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
quartz-jobs-2.2.1-sources.jar 好东西,不解释
quartz-all-1.6.0.rar 找了N久,终于找到了,留下来先!
quartz-oracle-1.8.6.jar
quartz-all-1.8.4.jar
quartz-all-1.6.0.jarquartz-all-1.6.0.jarquartz-all-1.6.0.jar
quartz-all-1.8.5.jar quartz-all-1.8.5.jar quartz-all-1.8.5.jar quartz-all-1.8.5.jar
调度框架quartz-all-1.6.5.jar
quartz-jboss-1.8.6.jar quartz集群
quartz-2.2.2-版本+springboot2.x ~~~有example和demo。。个人整理。
quartz-all-1.6.0 jar包 java定时任务
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
quartz-all-1.6.6.jar 定时任务 与Spring整合必须使用Quartz1.8.x及以下版本 否则报错 java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org....