如何在Quartz.net中使用多线程

时间:2016-02-25 19:56:54

标签: c# .net quartz.net-2.0

我打算使用quartz.net来处理文件。

  • 我每小时会收到一个或多个文件,每个文件将有1000个不同国家/地区的行。
  • 我想阅读这些行,验证,处理并将其插入多个表中。
  • 我想选择1个文件,对于该文件中的每个不同国家/地区,我想创建一个帖子。这样一个线程将处理1个国家的所有数据。
  • 在给定时间内,线程不应超过5个。

现在我如何在quartz.net中定义它?下面是我所拥有的代码,我逐个浏览每个文件,每行一行,我没有进行任何多线程

安排工作

var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "MyScheduler";
properties["quartz.threadPool.threadCount"] = "5";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler s = sf.GetScheduler();
if (!s.IsStarted)
    s.Start();

var jobKey = new JobKey("UniqueJobName", "BatchProcess");
if (s.GetJobDetail(jobKey) != null)
    return "Error! Already running";

IJobDetail jobDetail = JobBuilder.Create<CountryProcessJob>()
    .WithIdentity(jobKey)
    .Build();

ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("UniqueTriggerName", "BatchProcess")
    .StartAt(DateTime.Now.AddSeconds(1))
    .Build();

s.ScheduleJob(jobDetail, trigger);

工作

public class CountryProcessJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        While() // TillAllFilesAreProcessed
        {
        // Read A File
            While() //for each row in file
            {
                // validate
                // Process
                // Insert
            }
        }
    }
}

我是否应该有一个主要的Job来循环访问一个文件,然后在Job中我应该定义多个Jobs以处理每个国家/地区?这是如何在石英中实现多线程的?

安排主要工作

var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "MyScheduler";
properties["quartz.threadPool.threadCount"] = "5";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler s = sf.GetScheduler();
if (!s.IsStarted)
    s.Start();

var jobKey = new JobKey("UniqueJobName", "BatchProcess");
if (s.GetJobDetail(jobKey) != null)
    return "Error! Already running";

IJobDetail jobDetail = JobBuilder.Create<FileProcessJob>()
    .WithIdentity(jobKey)
    .Build();

ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("UniqueTriggerName", "BatchProcess")
    .StartAt(DateTime.Now.AddSeconds(1))
    .Build();

s.ScheduleJob(jobDetail, trigger);

主要工作

public class FileProcessJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        while() // TillAllFilesAreProcessed
        {
        // Read A File
            foreach(var eachCountry in  file) //for each row in file
            {
                // Create a Job
                var jobKey = new JobKey("UniqueCountryJobName", "BatchProcess");
                if (s.GetJobDetail(jobKey) != null)
                    return "Error! Already running";

                IJobDetail jobDetail = JobBuilder.Create<CountryProcessJob>()
                    .WithIdentity(jobKey)
                    .Build();

                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("UniqueCountryTriggerName", "BatchProcess")
                    .StartAt(DateTime.Now.AddSeconds(1))
                    .Build();

                s.ScheduleJob(jobDetail, trigger);              
            }
        }
    }
}

为每个国家/地区创建多个作业

public class CountryProcessJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        // For each row for that country 
        // validate
        // Process
        // Insert
    }
}

那么我应该创建多个作业来实现多个线程同时运行吗?请帮我运行5个并发线程,在一个文件中处理每个不同的国家。

2 个答案:

答案 0 :(得分:0)

Quartz.Net Jobs在一个单独的线程中运行。所以如果你想配置线程的最大数量,请看看这个答案:https://stackoverflow.com/a/4108795/745011

答案 1 :(得分:0)

您可以创建一个单独的静态类,并在execute方法中调用它。静态类在内存中有固定的空间。

public class ReadCountry : IJob
{
    public void Execute(IJobExecutionContext context)
    {
       CountryProcessJob.DoIt();
    }
}

CountryProcessJob类

public static class CountryProcessJob
    {
        public static void DoIt()
        {
            While() // TillAllFilesAreProcessed
            {
            // Read A File
                While() //for each row in file
                {
                    // validate
                    // Process
                    // Insert
                }
            }
        }
    }