gpt4 book ai didi

c# - "Scheduler already exists issue"仍然存在

转载 作者:行者123 更新时间:2023-12-05 05:26:24 24 4
gpt4 key购买 nike

即使我用过 Tarun Arorasolution

Scheduler with the name xxx already exists.

问题,我仍然得到同样的错误。这是他的解决方案,我假设他已经正确地实现了 Singleton 模式:

public class Scheduler
{
public readonly IScheduler Instance;
public string Address { get; private set; }
public string JobName { get; set; }
public string JobGroup { get; set; }
public int Priority { get; set; }
public string CronExpression { get; set; }

private readonly ISchedulerFactory _schedulerFactory;


public Scheduler(string server, int port, string scheduler)
{
Address = string.Format("tcp://{0}:{1}/{2}", server, port, scheduler);
_schedulerFactory = new StdSchedulerFactory(GetProperties(Address));

try
{
Instance = _schedulerFactory.GetScheduler();

if (!Instance.IsStarted)
Instance.Start();
}
catch (SchedulerException ex)
{
throw new Exception(string.Format("Failed: {0}", ex.Message));
}
}

private static NameValueCollection GetProperties(string address)
{
var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "ServerScheduler";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.threadPool.threadCount"] = "0";
properties["quartz.scheduler.proxy.address"] = address;
return properties;
}

public IScheduler GetScheduler()
{
return Instance;
}
}

我必须承认我没有使用他所说的最后一部分

If you wanted to call Scheduler then you should be using something like the code sample below…

public SchedulerMetaData GetMetaData()
{
var scheduler = new Scheduler("ServerName", Convert.ToInt32("PortNumber"), "Scheduler"));
return scheduler.GetMetaData();
}

这是我在我的应用程序中调用调度程序的方式:

IScheduler sched = new Scheduler(logger, "127.0.0.1", 555, "QuartzScheduler").Instance;
IJobDetail postbagjob = null;
ITrigger postbagJobTrigger = null;
try
{
postbagjob = JobBuilder.Create<PostbagJob>()
.WithIdentity(jobName, jobGroup)
.UsingJobData("CampaignId", campaignId.ToString())
.UsingJobData("CampaignType", campaignType)
.Build();
postbagJobTrigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity(triggerName, triggerGroup)
.WithCronSchedule(cron)
.StartAt(DateTime.Now)
.Build();
}
catch (SchedulerException ex)
{
MsgBox.Show(ex.Message);
}

它在我第一次要添加作业时起作用,但在我第二次调用它时,sched 变成了 null

最佳答案

我已经测试了该实现,它似乎有效。
您的解决方案中必须有其他东西阻止事情正常工作。

你确定在你的服务器上运行的作业是 PostbagJob 吗?

我建议您检查服务器的配置。确保你有这样的东西:

<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz"/>
<add key="quartz.scheduler.exporter.port" value="555"/>
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler"/>
<add key="quartz.scheduler.exporter.channelType" value="tcp"/>
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz"/>

关于您的 cron 触发器,您能告诉我们什么?你能发布 cron 表达式吗?
为什么不尝试将其更改为简单的触发器并查看其工作原理:

postbagJobTrigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("SampleTrigger", "QUARTZGROUP")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())
.StartNow()
.Build();

您应该做的另一件事是在服务器和客户端之间与作业共享一个程序集,以便它们具有相同的签名。

我对 Scheduler 类做了一些更改。你可以找到最终结果 here .

注意:

要运行服务器和客户端,请确保您在解决方案中配置了多个启动项目(右键单击解决方案)。

更新:

更好的方法是以这种方式创建单例类:

public sealed class QuartzScheduler
{
private static QuartzScheduler instance = null;

private static readonly object padlock = new object();

private readonly ISchedulerFactory SchedulerFactory = null;
private readonly IScheduler Scheduler = null;

QuartzScheduler()
{
this.SchedulerFactory = new StdSchedulerFactory();
this.Scheduler = this.SchedulerFactory.GetScheduler();
}

public static IScheduler Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new QuartzScheduler();
}
return instance.Scheduler;
}
}
}
}

如果你想read更多信息,您可以在 Jon Skeet 的博客上找到很多有用的信息。
注意:我使用的是第三个版本。

现在您可以在 Windows 窗体应用程序中简单地使用该对象:

QuartzScheduler.Instance.ScheduleJob(postbagjob, postbagJobTrigger);

仅此而已。

如果你查看我的github repo你可以找到一个可行的解决方案。
我已经在 app.config 文件中移动了客户端配置;我想自定义更容易:

<quartz>
<add key="quartz.threadPool.type" value="Quartz.Simpl.ZeroSizeThreadPool, Quartz" />
<add key="quartz.scheduler.instanceName" value="RemoteClient"/>
<add key="quartz.threadPool.threadCount" value="0"/>
<add key="quartz.scheduler.proxy" value="true"/>
<add key="quartz.scheduler.proxy.address" value="tcp://127.0.0.1:555/QuartzScheduler"/>
</quartz>

要记住的另一件事是您的客户端正在调度作业,而不是真正运行调度程序,因此您应该将线程池配置为 ZeroSizeThreadPool

关于c# - "Scheduler already exists issue"仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com