我在asp.net mvc app中集成了quartz.net。
我计划每天早上跑一次。 大多数时候,我的Sample工作会激活2次
2011-06-06 04:00:00.0077|INFO| -> once
2011-06-06 04:00:00.0233|INFO| -> twice
但事实上,它只发射一次,但很少发生(实际只发生一次)。
我很想知道为什么会发生这种情况,或者也就如何解决此事件的建议(它发生在托管环境中)
这些是整合点:
的global.asax.cs
protected void Application_Start()
{
ISchedulerFactory factory = new StdSchedulerFactory()
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();
}
的web.config
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<quartz>
<add key="quartz.scheduler.instanceName" value="JobScheduler" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
<add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.JobInitializationPlugin, Quartz" />
<add key="quartz.plugin.xml.fileNames" value="~/jobs.config" />
</quartz>
jobs.config
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">
<job>
<job-detail>
<name>SampleJob</name>
<group>SampleJobs</group>
<description>sample</description>
<job-type>Services.SampleJob, Sample</job-type>
<volatile>false</volatile>
<durable>true</durable>
<recover>false</recover>
</job-detail>
<trigger>
<cron>
<name>SampleJobTrigger</name>
<group>SampleJobs</group>
<description>Description</description>
<job-name>SampleJob</job-name>
<job-group>SampleJobs</job-group>
<cron-expression>0 0 4 * * ? *</cron-expression>
</cron>
</trigger>
</job>
</quartz>
任何帮助或指针都非常适合
- MB
答案 0 :(得分:0)
真的很难说。一切似乎都没事 我建议你让你的工厂和调度程序单例(它应该是这样)并看看会发生什么:
public class MyScheduler
{
static MyScheduler()
{
_schedulerFactory = new StdSchedulerFactory(getProperties());
_scheduler = _schedulerFactory.GetScheduler();
}
public static IScheduler GetScheduler()
{
return _scheduler;
}
private static readonly ISchedulerFactory _schedulerFactory;
private static readonly IScheduler _scheduler;
}
如果我们想将一些属性传递给我们的调度程序,我们可以使用配置文件或:
private static NameValueCollection getProperties()
{
var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "MyScheduler";
properties["quartz.scheduler.instanceId"] = "Web";
// Configure Thread Pool
properties["quartz.threadPool.type"] = "Quartz.Simpl.ZeroSizeThreadPool, Quartz";
// Configure Job Store -->
properties["quartz.jobStore.misfireThreshold"] = "60000";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.jobStore.useProperties"] = "true";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";
properties["quartz.dataSource.default.connectionString"] = "<connection string>";
return properties;
}
答案 1 :(得分:0)
你的工作进展得很快。
尝试添加System.Threading.Thread.Sleep(1000)
并且只会启动一次。
谢谢!
答案 2 :(得分:0)
这是一张旧的,已经回答的票。但是我今天在测试环境中遇到了这个问题并追捕了可能的原因。
我们运行多个应用服务器。作业应该只从App1运行。但不知何故,App2的配置被踩到了,所以它不仅运行作业,还写入App1的日志文件。
所以看起来App1正在运行两次,相隔毫秒。正是原帖所看到的。