首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Quartz.net中处理JobExecutionException

在Quartz.net中处理JobExecutionException
EN

Stack Overflow用户
提问于 2010-07-14 20:54:33
回答 3查看 15.2K关注 0票数 20

可能是个愚蠢的问题。但不管怎样,还是这样吧。

我已经设置了quartz,可以调度作业,并且可以确认作业(实现IJob接口)正在工作。

查看网站上的文档(本教程的第3课):

允许从execute方法引发的唯一异常类型是JobExecutionException

我希望当一个我没有显式处理的异常发生时,它应该抛出一个JobExecutionException,这样我就可以把它记录在‘父’应用程序中。我已经将我的代码包装在一个try catch中,并抛出了JobExecutionException,但是现在在哪里处理它呢?

我不会在任何地方调用execute方法,它是由Quartz (在单独的线程上)处理的。那么,当这个错误发生时,我该如何处理呢?我真的不想吞下工作中的错误

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-13 12:17:10

通常,您将按如下方式设置作业的execute方法:

代码语言:javascript
复制
try
{
    // the work you want to do goes here
}
catch (ExceptionTypeYouWantToHandle1 ex1)
{
    // handle exception
}
catch (ExceptionTypeYouWantToHandle2 ex2)
{
    // handle exception
}
// and so on
catch (Exception ex)
{
    // something really unexpected happened, so give up
    throw new JobExecutionException("Something awful happened", ex, false); // or set to true if you want to refire
}

此时,调度程序本身会将异常记录到它正在记录的任何位置(基于配置)。

票数 12
EN

Stack Overflow用户

发布于 2011-12-31 06:07:47

我使用基类来捕获所有异常,从而解决了这个问题:

代码语言:javascript
复制
public abstract class JobBase : IJob
{
    protected JobBase()
    {
    }

    public abstract void ExecuteJob(JobExecutionContext context);

    public void Execute(JobExecutionContext context)
    {
        string logSource = context.JobDetail.FullName;

        try
        {
            ExecuteJob(context);
        }
        catch (Exception e)
        {
           // Log exception
        }
    }
}

您的Job类应如下所示:

代码语言:javascript
复制
public class SomeJob : JobBase
{
    public SomeJob()
    {
    }

    public override void ExecuteJob(JobExecutionContext context)
    {
        // Do the actual job here
    }
}
票数 18
EN

Stack Overflow用户

发布于 2012-11-07 16:54:41

如前所述,在全局级别“检测”JobExecutionException的正确方法是实现并注册IJobListener,并检查JobWasExecuted()方法中的JobExecutionException参数是否为!= null。

然而,我遇到的问题(从OP的其他评论来看,他也面临着这个问题)是Quartz没有处理JobExecutionException (它应该处理的),这导致了一个未处理的异常终止应用程序。

到目前为止,我使用的是Quartz.NET 2.0.1发行版(.NET3.5)包中的预编译DLL。为了找出问题的根源,我引用了Quartz项目/源码,令我惊讶的是它突然开始工作了?!

有趣的是,这是Quartz库代码,它执行IJob并处理JobExecutionException:

代码语言:javascript
复制
try {
    if (log.IsDebugEnabled) {
       log.Debug("Calling Execute on job " + jobDetail.Key);
    }
    job.Execute(jec);
    endTime = SystemTime.UtcNow();
} catch (JobExecutionException jee) {
    endTime = SystemTime.UtcNow();
    jobExEx = jee;
    log.Info(string.Format(CultureInfo.InvariantCulture, "Job {0} threw a JobExecutionException: ", jobDetail.Key), jobExEx);
} catch (Exception e) {
   // other stuff here...
}

接下来的事情是直接引用我新编译的DLL,这也是有效的。遗憾的是,我不能告诉你为什么这样做是可行的,我现在也没有任何时间去深入研究它,但也许这对某些人有帮助。也许其他一些人可以证实这一点,甚至可以做出解释。它可能与不同的目标平台(x86/64位)有关?

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3246277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档