forked from MassTransit/MassTransit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
106 lines (86 loc) · 3.6 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright 2007-2008 The Apache Software Foundation.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
// this file except in compliance with the License. You may obtain a copy of the
// License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
namespace MassTransit.RuntimeServices
{
using System;
using System.IO;
using log4net;
using log4net.Config;
using Magnum.Reflection;
using Services.HealthMonitoring;
using Services.Subscriptions.Server;
using Services.Timeout;
using StructureMap;
using StructureMap.Configuration.DSL;
using Topshelf;
using Topshelf.Configuration;
using Topshelf.Configuration.Dsl;
using Transports.Msmq;
internal class Program
{
private static readonly ILog _log = LogManager.GetLogger(typeof (Program));
private static void Main(string[] args)
{
BootstrapLogger();
MsmqEndpointConfigurator.Defaults(x => { x.CreateMissingQueues = true; });
ObjectFactory.Initialize(x => { x.For<IConfiguration>().Use<Configuration>(); });
var serviceConfiguration = ObjectFactory.GetInstance<IConfiguration>();
RunConfiguration configuration = RunnerConfigurator.New(config =>
{
config.SetServiceName(typeof (Program).Namespace);
config.SetDisplayName(typeof (Program).Namespace);
config.SetDescription("MassTransit Runtime Services (Subscription, Timeout, Health Monitoring)");
config.RunAsLocalSystem();
config.DependencyOnMsmq();
if (serviceConfiguration.SubscriptionServiceEnabled)
{
config.ConfigureService<SubscriptionService>(service => { ConfigureService<SubscriptionService, SubscriptionServiceRegistry>(service, start => start.Start(), stop => stop.Stop()); });
}
if (serviceConfiguration.HealthServiceEnabled)
{
config.ConfigureService<HealthService>(service => { ConfigureService<HealthService, HealthServiceRegistry>(service, start => start.Start(), stop => stop.Stop()); });
}
if (serviceConfiguration.TimeoutServiceEnabled)
{
config.ConfigureService<TimeoutService>(service => { ConfigureService<TimeoutService, TimeoutServiceRegistry>(service, start => start.Start(), stop => stop.Stop()); });
}
config.AfterStoppingTheHost(x => { _log.Info("MassTransit Runtime Services are exiting..."); });
});
Runner.Host(configuration, args);
}
private static void BootstrapLogger()
{
string configFileName = AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + typeof (Program).Namespace + ".log4net.xml";
XmlConfigurator.ConfigureAndWatch(new FileInfo(configFileName));
_log.Info("Loading " + typeof (Program).Namespace + " Services...");
}
private static void ConfigureService<TService, TRegistry>(IServiceConfigurator<TService> service, Action<TService> start, Action<TService> stop)
where TRegistry : Registry
{
var container = new Container(x =>
{
x.For<IConfiguration>()
.Singleton()
.Add<Configuration>();
x.For<TService>()
.Singleton()
.Use<TService>();
});
TRegistry registry = FastActivator<TRegistry>.Create(container);
container.Configure(x => x.AddRegistry(registry));
service.HowToBuildService(builder => container.GetInstance<TService>());
service.WhenStarted(start);
service.WhenStopped(stop);
}
}
}