Skip to content

Commit fdae4ce

Browse files
committed
Merge branch 'develop'
2 parents 599db8a + 5274d32 commit fdae4ce

File tree

14 files changed

+133
-80
lines changed

14 files changed

+133
-80
lines changed

IntegrationEngine.Core/package.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>IntegrationEngine.Core</id>
5-
<version>2.0.0-alpha1</version>
5+
<version>2.0.0-alpha2</version>
66
<title>InEngine.NET Core</title>
77
<authors>Ethan Hann</authors>
88
<owners>Ethan Hann</owners>
@@ -19,7 +19,7 @@
1919
<dependencies>
2020
<dependency id="Elasticsearch.Net" version="1.3.1"/>
2121
<dependency id="EntityFramework" version="6.1.2" />
22-
<dependency id="IntegrationEngine.Model" version="2.0.0-alpha1" />
22+
<dependency id="IntegrationEngine.Model" version="2.0.0-alpha2" />
2323
<dependency id="log4net" version="2.0.3" />
2424
<dependency id="MySql.Data" version="6.9.5" />
2525
<dependency id="MySql.Data.Entity" version="6.9.5" />

IntegrationEngine.Model/CronTrigger.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class CronTrigger : IHasStringId, IIntegrationJobTrigger
77
public string Id { get; set; }
88
public string JobType { get; set; }
99
public string CronExpressionString { get; set; }
10-
public TimeZoneInfo TimeZone { get; set; }
10+
TimeZoneInfo _timeZone { get; set; }
11+
public TimeZoneInfo TimeZone { get { return _timeZone ?? TimeZoneInfo.Utc; } set { _timeZone = value; } }
1112
}
1213
}

IntegrationEngine.Model/package.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>IntegrationEngine.Model</id>
5-
<version>2.0.0-alpha1</version>
5+
<version>2.0.0-alpha2</version>
66
<title>InEngine.NET Model</title>
77
<authors>Ethan Hann</authors>
88
<owners>Ethan Hann</owners>

IntegrationEngine.Tests/Api/Controllers/CronTriggerControllerTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void ShouldScheduleJobWhenCronTriggerIsCreated()
2626
esRepository.Setup(x => x.Insert(expected)).Returns(expected);
2727
subject.Repository = esRepository.Object;
2828

29-
subject.PostIntegrationJob(expected);
29+
subject.PostCronTrigger(expected);
3030

3131
engineScheduler.Verify(x => x
3232
.ScheduleJobWithCronTrigger(It.Is<CronTrigger>(y => y.JobType == jobType &&

IntegrationEngine/Api/Controllers/CronTriggerController.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ public class CronTriggerController : ApiController
1414
public IEngineScheduler EngineScheduler { get; set; }
1515

1616
public CronTriggerController()
17-
{
18-
}
17+
{}
1918

2019
public CronTriggerController(ESRepository<CronTrigger> repository, IEngineScheduler engineScheduler)
2120
: this()
@@ -24,46 +23,48 @@ public CronTriggerController(ESRepository<CronTrigger> repository, IEngineSchedu
2423
EngineScheduler = engineScheduler;
2524
}
2625

27-
// GET api/IntegrationJob
28-
public IEnumerable<CronTrigger> GetIntegrationJobs()
26+
// GET api/CronTrigger
27+
public IEnumerable<CronTrigger> GetCronTriggers()
2928
{
3029
return Repository.SelectAll();
3130
}
3231

33-
// GET api/IntegrationJob/5
32+
// GET api/CronTrigger/5
3433
[ResponseType(typeof(CronTrigger))]
35-
public IHttpActionResult GetIntegrationJob(string id)
34+
public IHttpActionResult GetCronTrigger(string id)
3635
{
3736
var trigger = Repository.SelectById(id);
3837
if (trigger == null)
3938
return NotFound();
4039
return Ok(trigger);
4140
}
4241

43-
// PUT api/IntegrationJob/5
44-
public IHttpActionResult PutIntegrationJob(string id, CronTrigger trigger)
42+
// PUT api/CronTrigger/5
43+
public IHttpActionResult PutCronTrigger(string id, CronTrigger trigger)
4544
{
4645
if (id != trigger.Id)
4746
return BadRequest();
47+
if (!trigger.CronExpressionString.IsValidCronExpression())
48+
return BadRequest("Cron expression is not valid: " + trigger.CronExpressionString);
4849
Repository.Update(trigger);
4950
EngineScheduler.ScheduleJobWithCronTrigger(trigger);
5051
return StatusCode(HttpStatusCode.NoContent);
5152
}
5253

53-
// POST api/IntegrationJob
54+
// POST api/CronTrigger
5455
[ResponseType(typeof(CronTrigger))]
55-
public IHttpActionResult PostIntegrationJob(CronTrigger trigger)
56+
public IHttpActionResult PostCronTrigger(CronTrigger trigger)
5657
{
57-
if (trigger.CronExpressionString.IsValidCronExpression())
58+
if (!trigger.CronExpressionString.IsValidCronExpression())
5859
return BadRequest("Cron expression is not valid: " + trigger.CronExpressionString);
5960
var triggerWithId = Repository.Insert(trigger);
6061
EngineScheduler.ScheduleJobWithCronTrigger(triggerWithId);
6162
return CreatedAtRoute("DefaultApi", new { id = triggerWithId.Id }, triggerWithId);
6263
}
6364

64-
// DELETE api/IntegrationJob/5
65+
// DELETE api/CronTrigger/5
6566
[ResponseType(typeof(CronTrigger))]
66-
public IHttpActionResult DeleteIntegrationJob(string id)
67+
public IHttpActionResult DeleteCronTrigger(string id)
6768
{
6869
var trigger = Repository.SelectById(id);
6970
if (trigger == null)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Net;
4+
using System.Web.Http;
5+
using System.Web.Http.Description;
6+
using IntegrationEngine.Core.Storage;
7+
using IntegrationEngine.Model;
8+
using IntegrationEngine.Scheduler;
9+
using Quartz.Impl.Matchers;
10+
using Quartz;
11+
12+
namespace IntegrationEngine.Api.Controllers
13+
{
14+
public class JobController : ApiController
15+
{
16+
public IEngineScheduler EngineScheduler { get; set; }
17+
18+
public JobController()
19+
{}
20+
21+
public JobController(IEngineScheduler engineScheduler)
22+
: this()
23+
{
24+
EngineScheduler = engineScheduler;
25+
}
26+
27+
public IHttpActionResult GetJobKeys()
28+
{
29+
return Ok(EngineScheduler.Scheduler
30+
.GetJobKeys(GroupMatcher<JobKey>.AnyGroup())
31+
.Select(x => x.ToString()).ToList());
32+
}
33+
}
34+
}

IntegrationEngine/Api/Controllers/SimpleTriggerController.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,24 @@ public SimpleTriggerController(ESRepository<SimpleTrigger> repository, IEngineSc
2929
EngineScheduler = engineScheduler;
3030
}
3131

32-
// GET api/IntegrationJob
33-
public IEnumerable<SimpleTrigger> GetIntegrationJobs()
32+
// GET api/SimpleTrigger
33+
public IEnumerable<SimpleTrigger> GetSimpleTriggers()
3434
{
3535
return Repository.SelectAll();
3636
}
3737

38-
// GET api/IntegrationJob/5
38+
// GET api/SimpleTrigger/5
3939
[ResponseType(typeof(SimpleTrigger))]
40-
public IHttpActionResult GetIntegrationJob(string id)
40+
public IHttpActionResult GetSimpleTrigger(string id)
4141
{
4242
var trigger = Repository.SelectById(id);
4343
if (trigger == null)
4444
return NotFound();
4545
return Ok(trigger);
4646
}
4747

48-
// PUT api/IntegrationJob/5
49-
public IHttpActionResult PutIntegrationJob(string id, SimpleTrigger trigger)
48+
// PUT api/SimpleTrigger/5
49+
public IHttpActionResult PutSimpleTrigger(string id, SimpleTrigger trigger)
5050
{
5151
if (id != trigger.Id)
5252
return BadRequest();
@@ -55,18 +55,18 @@ public IHttpActionResult PutIntegrationJob(string id, SimpleTrigger trigger)
5555
return StatusCode(HttpStatusCode.NoContent);
5656
}
5757

58-
// POST api/IntegrationJob
58+
// POST api/SimpleTrigger
5959
[ResponseType(typeof(SimpleTrigger))]
60-
public IHttpActionResult PostIntegrationJob(SimpleTrigger trigger)
60+
public IHttpActionResult PostSimpleTrigger(SimpleTrigger trigger)
6161
{
6262
var triggerWithId = Repository.Insert(trigger);
6363
EngineScheduler.ScheduleJobWithSimpleTrigger(triggerWithId);
6464
return CreatedAtRoute("DefaultApi", new { id = triggerWithId.Id }, triggerWithId);
6565
}
6666

67-
// DELETE api/IntegrationJob/5
67+
// DELETE api/SimpleTrigger/5
6868
[ResponseType(typeof(SimpleTrigger))]
69-
public IHttpActionResult DeleteIntegrationJob(string id)
69+
public IHttpActionResult DeleteSimpleTrigger(string id)
7070
{
7171
var trigger = Repository.SelectById(id);
7272
if (trigger == null)

IntegrationEngine/EngineHostConfiguration.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,13 @@ public void SetupScheduler()
129129
};
130130
Container.RegisterInstance<IEngineScheduler>(engineScheduler);
131131
engineScheduler.Start();
132-
var simpleTriggers = Container.Resolve<IElasticClient>().Search<SimpleTrigger>(x => x).Documents;
133-
var cronTriggers = Container.Resolve<IElasticClient>().Search<CronTrigger>(x => x).Documents;
132+
var simpleTriggers = Container.Resolve<ESRepository<SimpleTrigger>>().SelectAll();
133+
var cronTriggers = Container.Resolve<ESRepository<CronTrigger>>().SelectAll();
134134
foreach (var jobType in IntegrationJobTypes)
135135
{
136-
// Register job
137-
var jobDetail = engineScheduler.CreateJobDetail(jobType);
138-
// Schedule the job with applicable triggers
139-
engineScheduler.ScheduleJobsWithSimpleTriggers(simpleTriggers, jobType, jobDetail);
140-
engineScheduler.ScheduleJobsWithCronTriggers(cronTriggers, jobType, jobDetail);
136+
var jobDetail = engineScheduler.JobDetailFactory(jobType);
137+
engineScheduler.ScheduleJobsWithTriggers(simpleTriggers, jobType, jobDetail);
138+
engineScheduler.ScheduleJobsWithTriggers(cronTriggers, jobType, jobDetail);
141139
}
142140
}
143141

IntegrationEngine/IntegrationEngine.csproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@
129129
</Reference>
130130
</ItemGroup>
131131
<ItemGroup>
132+
<Compile Include="Api\Controllers\JobController.cs" />
132133
<Compile Include="Api\IntegrationEngineApi.cs" />
133134
<Compile Include="Api\Startup.cs" />
134135
<Compile Include="Configuration\MessageQueueConfiguration.cs" />
@@ -177,7 +178,5 @@
177178
</ProjectReference>
178179
</ItemGroup>
179180
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
180-
<ItemGroup>
181-
<Folder Include="Scheduler\" />
182-
</ItemGroup>
181+
<ItemGroup />
183182
</Project>

IntegrationEngine/Scheduler/EngineScheduler.cs

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public void Start()
2222
Scheduler.Start();
2323
}
2424

25-
public IJobDetail CreateJobDetail(Type jobType)
25+
public IJobDetail JobDetailFactory(Type jobType)
2626
{
2727
var integrationJob = Activator.CreateInstance(jobType) as IIntegrationJob;
2828
var jobDetailsDataMap = new JobDataMap();
@@ -37,59 +37,68 @@ public IJobDetail CreateJobDetail(Type jobType)
3737
public virtual void ScheduleJobWithCronTrigger(CronTrigger triggerDefinition)
3838
{
3939
var jobType = IntegrationJobTypes.Where(x => x.FullName == triggerDefinition.JobType).First();
40-
var jobDetail = CreateJobDetail(jobType);
41-
ScheduleJobWithCronTrigger(triggerDefinition, jobType, jobDetail);
40+
var jobDetail = JobDetailFactory(jobType);
41+
var trigger = CronTriggerFactory(triggerDefinition, jobType, jobDetail);
42+
TryScheduleJobWithTrigger(trigger, jobType, jobDetail);
4243
}
4344

44-
public void ScheduleJobWithCronTrigger(CronTrigger triggerDefinition, Type jobType, IJobDetail jobDetail)
45+
public void ScheduleJobWithSimpleTrigger(SimpleTrigger triggerDefinition)
46+
{
47+
var jobType = IntegrationJobTypes.Where(x => x.FullName == triggerDefinition.JobType).First();
48+
var jobDetail = JobDetailFactory(jobType);
49+
var trigger = SimpleTriggerFactory(triggerDefinition, jobType, jobDetail);
50+
TryScheduleJobWithTrigger(trigger, jobType, jobDetail);
51+
}
52+
53+
public void TryScheduleJobWithTrigger(ITrigger trigger, Type jobType, IJobDetail jobDetail)
54+
{
55+
if (Scheduler.CheckExists(jobDetail.Key))
56+
Scheduler.RescheduleJob(trigger.Key, trigger);
57+
else
58+
Scheduler.ScheduleJob(jobDetail, trigger);
59+
}
60+
61+
public void ScheduleJobsWithTriggers(IEnumerable<IIntegrationJobTrigger> triggerDefs, Type jobType, IJobDetail jobDetail)
4562
{
46-
var trigger = TriggerBuilder.Create()
47-
.WithIdentity(GenerateTriggerId(jobType, triggerDefinition), jobType.Namespace);
48-
if (triggerDefinition.CronExpressionString != null) {
49-
trigger.WithCronSchedule(triggerDefinition.CronExpressionString, x => x.InTimeZone(triggerDefinition.TimeZone));
63+
if (!triggerDefs.Any())
64+
return;
65+
var triggersForJobs = new Quartz.Collection.HashSet<ITrigger>();
66+
foreach (var triggerDef in triggerDefs)
67+
{
68+
if (triggerDef is CronTrigger)
69+
triggersForJobs.Add(CronTriggerFactory(triggerDef as CronTrigger, jobType, jobDetail));
70+
else if (triggerDef is SimpleTrigger)
71+
triggersForJobs.Add(SimpleTriggerFactory(triggerDef as SimpleTrigger, jobType, jobDetail));
5072
}
51-
Scheduler.ScheduleJob(jobDetail, trigger.Build());
73+
Scheduler.ScheduleJob(jobDetail, triggersForJobs, true);
5274
}
5375

54-
public void ScheduleJobWithSimpleTrigger(SimpleTrigger triggerDefinition)
76+
TriggerBuilder TriggerBuilderFactory(string triggerName, string triggerGroup)
5577
{
56-
var jobType = IntegrationJobTypes.Where(x => x.FullName == triggerDefinition.JobType).First();
57-
var jobDetail = CreateJobDetail(jobType);
58-
ScheduleJobWithSimpleTrigger(triggerDefinition, jobType, jobDetail);;
78+
return TriggerBuilder.Create().WithIdentity(new TriggerKey(triggerName, triggerGroup));
5979
}
6080

61-
public void ScheduleJobWithSimpleTrigger(SimpleTrigger triggerDefinition, Type jobType, IJobDetail jobDetail)
81+
public ITrigger SimpleTriggerFactory(SimpleTrigger triggerDefinition, Type jobType, IJobDetail jobDetail)
6282
{
63-
var trigger = TriggerBuilder.Create()
64-
.WithIdentity(GenerateTriggerId(jobType, triggerDefinition), jobType.Namespace);
83+
var triggerBuilder = TriggerBuilderFactory(triggerDefinition.Id, jobType.FullName);
6584
Action<SimpleScheduleBuilder> simpleScheduleBuilderAction;
6685
if (triggerDefinition.RepeatCount > 0)
6786
simpleScheduleBuilderAction = x => x.WithInterval(triggerDefinition.RepeatInterval).WithRepeatCount(triggerDefinition.RepeatCount);
6887
else
6988
simpleScheduleBuilderAction = x => x.WithInterval(triggerDefinition.RepeatInterval);
70-
trigger.WithSimpleSchedule(simpleScheduleBuilderAction);
89+
triggerBuilder.WithSimpleSchedule(simpleScheduleBuilderAction);
7190
if (!object.Equals(triggerDefinition.StartTimeUtc, default(DateTimeOffset)))
72-
trigger.StartAt(triggerDefinition.StartTimeUtc);
91+
triggerBuilder.StartAt(triggerDefinition.StartTimeUtc);
7392
else
74-
trigger.StartNow();
75-
Scheduler.ScheduleJob(jobDetail, trigger.Build());
76-
}
77-
78-
public void ScheduleJobsWithCronTriggers(IEnumerable<CronTrigger> triggers, Type jobType, IJobDetail jobDetail)
79-
{
80-
foreach (var triggerDefinition in triggers.Where(x => x.JobType == jobType.FullName))
81-
ScheduleJobWithCronTrigger(triggerDefinition, jobType, jobDetail);
82-
}
83-
84-
public void ScheduleJobsWithSimpleTriggers(IEnumerable<SimpleTrigger> triggers, Type jobType, IJobDetail jobDetail)
85-
{
86-
foreach (var triggerDefinition in triggers.Where(x => x.JobType == jobType.FullName))
87-
ScheduleJobWithSimpleTrigger(triggerDefinition, jobType, jobDetail);
93+
triggerBuilder.StartNow();
94+
return triggerBuilder.Build();
8895
}
8996

90-
string GenerateTriggerId(Type jobType, IHasStringId triggerDefinition)
97+
public ITrigger CronTriggerFactory(CronTrigger triggerDefinition, Type jobType, IJobDetail jobDetail)
9198
{
92-
return string.Format("{0}-{1}", jobType.Name, triggerDefinition.Id);
99+
var triggerBuilder = TriggerBuilderFactory(triggerDefinition.Id, jobType.FullName);
100+
triggerBuilder.WithCronSchedule(triggerDefinition.CronExpressionString, x => x.InTimeZone(triggerDefinition.TimeZone));
101+
return triggerBuilder.Build();
93102
}
94103
}
95104
}

0 commit comments

Comments
 (0)