`
征途2010
  • 浏览: 246566 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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-1.6.0.jar和quartz-all-1.6.0.jar

    在给定的压缩包文件中,我们有两个版本为1.6.0的Quartz JAR包:`quartz-1.6.0.jar`和`quartz-all-1.6.0.jar`。这两个JAR包虽然名字相似,但它们的内涵有所不同。 `quartz-1.6.0.jar`是Quartz的基本库,包含了核心的...

    quartz-2.3.0-API文档-中文版.zip

    赠送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-2.3.2-API文档-中英对照版.zip

    赠送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-2.3.2-API文档-中文版.zip

    赠送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-2.4.0-SNAPSHOT-distribution.tar.gz

    解压"quartz-2.4.0-SNAPSHOT-distribution.tar.gz"后,我们主要会看到一个名为"quartz-2.4.0-SNAPSHOT"的目录,其中包含了Quartz框架的所有组件和相关文档。这个目录下通常会有以下内容: 1. **JAR文件**:核心库...

    quartz-all-1.6.0

    在标题中提到的 "quartz-all-1.6.0" 版本,是 Quartz 框架的一个特定发行版,它包含了所有必要的组件和库,以便在 Java 环境下使用。 Quartz 主要功能包括: 1. **任务调度**:Quartz 提供了强大的 API,可以方便地...

    quartz-all-1.8.6.jar

    quartz-all-1.8.6.jar

    quartz-all-1.6.0.jar包定时任务jar

    这个"quartz-all-1.6.0.jar"包包含了Quartz库的完整功能,适用于1.6.0版本。Quartz的核心特性是能够创建、触发和管理定时任务,这些任务可以在指定的时间点或按照预定义的频率执行。 Quartz的主要组件包括Job(任务...

    quartz-2.3.0-distribution.zip

    "quartz-2.3.0-distribution.zip"这个压缩包包含了Quartz库的2.3.0版本及相关资源,对于开发者来说是学习和使用Quartz的重要资料。 1. **Quartz的核心概念** - **Job**:Quartz中的工作单元,代表一个需要执行的...

    quartz-all-1.6.0.jar

    Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中实现复杂的时间调度任务。...使用 "quartz-all-1.6.0.jar",你可以轻松地构建和管理复杂的调度策略,确保应用程序的自动化流程得以准确无误地执行。

    spring2.0 Quartz 执行每天定时任务 建议用quartz-all-1.8.4.jar更稳定,兼容性更好

    在使用Quartz与Spring集成时,首先需要在项目中引入Quartz的jar包,如标题中提到的`quartz-all-1.8.4.jar`,这个版本被认为是较稳定且具有较好的兼容性的。引入后,你需要配置Spring的ApplicationContext,声明一个...

    quartzall1.6.0jar_quartz-all-1.6.0.jar_

    "quartz-all-1.6.0.jar"是Quartz库的一个版本,集成了所有必需的组件,使得开发者能够在项目中轻松引入并使用Quartz的功能。这个JAR文件包含了Quartz的核心类库和其他依赖,使得你可以实现复杂的定时任务调度。 ...

    quartz-all-1.6.1-RC3.jar

    quartz-all-1.6.1-RC3.jar

    quartz-jobs-2.2.1-sources.jar

    quartz-jobs-2.2.1-sources.jar 好东西,不解释

    quartz-oracle-1.8.6.jar

    quartz-oracle-1.8.6.jar

    quartz-all-1.8.4.jar

    quartz-all-1.8.4.jar

    quartz-all-1.6.5.jar

    调度框架quartz-all-1.6.5.jar

    quartz-jboss-1.8.6.jar

    quartz-jboss-1.8.6.jar quartz集群

    quartz和spring-quartz

    Quartz和Spring-Quartz是两个在Java世界...“spring-quartz-demo”可能是一个完整的示例项目,你可以通过运行它来深入理解Quartz在Spring中的应用。通过研究这些资源,你可以更全面地掌握Quartz和Spring-Quartz的用法。

    quartz-2.2.2-distribution.rar

    标题中的 "quartz-2.2.2-distribution.rar" 指的是 Quartz 的 2.2.2 版本的发布包,包含了所有必要的文件和资源,方便用户在项目中集成和使用。 描述中提到 "quartz-2.2.2-版本+springboot2.x" 暗示了这个压缩包...

Global site tag (gtag.js) - Google Analytics