Skip to content

Commit ac632e8

Browse files
committed
Add more logging to Taskengine + refactor main
1 parent fda94dd commit ac632e8

File tree

1 file changed

+81
-70
lines changed

1 file changed

+81
-70
lines changed

TaskEngine/Program.cs

Lines changed: 81 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,32 @@ class Program
3333
public static ServiceProvider _serviceProvider;
3434
public static ILogger<Program> _logger;
3535
public static void Main()
36+
{
37+
Console.WriteLine("TaskEngine.Main starting up -GetConfigurations...");
38+
try {
39+
SetupServices(); // should never return
40+
createTaskQueues();
41+
runQueueAwakerForever();
42+
43+
} catch (Exception e) {
44+
// Some paranoia here; we *should* have a logger and exception handler in place
45+
// So this is only here to catch unexpected startup errors that otherwise might be silent
46+
Console.WriteLine($"Unhandled Exception Caught {e.Message}\n{e}\n");
47+
if(_logger !=null){
48+
_logger.LogError(e, "Unhandled Exception Caught");
49+
}
50+
}
51+
}
52+
public static void SetupServices()
3653
{
3754
var configuration = CTDbContext.GetConfigurations();
3855

3956
// This project relies on Dependency Injection to configure its various services,
4057
// For more info, https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1
4158
// All the services used are configured using the service provider.
59+
Console.WriteLine("SetupServices() - starting");
4260

43-
var serviceProvider = new ServiceCollection()
61+
_serviceProvider = new ServiceCollection()
4462
.AddLogging(builder =>
4563
{
4664
builder.AddConsole();
@@ -84,10 +102,9 @@ public static void Main()
84102
.AddSingleton<TempCode>()
85103
.BuildServiceProvider();
86104

87-
_serviceProvider = serviceProvider;
88-
_logger = serviceProvider.GetRequiredService<ILogger<Program>>();
105+
_logger = _serviceProvider.GetRequiredService<ILogger<Program>>();
89106

90-
Globals.appSettings = serviceProvider.GetService<IOptions<AppSettings>>().Value;
107+
Globals.appSettings = _serviceProvider.GetService<IOptions<AppSettings>>().Value;
91108
TaskEngineGlobals.KeyProvider = new KeyProvider(Globals.appSettings);
92109

93110
AppDomain currentDomain = AppDomain.CurrentDomain;
@@ -96,114 +113,108 @@ public static void Main()
96113
_logger.LogInformation("Seeding database");
97114

98115
// Seed the database, with some initial data.
99-
Seeder seeder = serviceProvider.GetService<Seeder>();
116+
Seeder seeder = _serviceProvider.GetService<Seeder>();
100117
seeder.Seed();
118+
}
101119

102-
_logger.LogInformation("Starting TaskEngine");
120+
121+
static void runQueueAwakerForever() {
122+
_logger.LogInformation("runQueueAwakerForever - start");
123+
QueueAwakerTask queueAwakerTask = _serviceProvider.GetService<QueueAwakerTask>();
103124

125+
int periodicCheck = Math.Max(1,Convert.ToInt32(Globals.appSettings.PERIODIC_CHECK_EVERY_MINUTES));
126+
int initialPauseMinutes = Math.Max(1, Convert.ToInt32(Globals.appSettings.INITIAL_TASKENGINE_PAUSE_MINUTES));
104127

128+
_logger.LogInformation("Periodic Check Every {0} minutes", periodicCheck);
129+
var timeInterval = new TimeSpan(0, periodicCheck, 0);
130+
131+
var initialPauseInterval = new TimeSpan(0, initialPauseMinutes, 0);
132+
_logger.LogInformation("Pausing {0} minutes before first periodicCheck", initialPauseInterval);
133+
134+
// Thread.Sleep(initialPauseInterval);
135+
Task.Delay(initialPauseInterval).Wait();
136+
// Check for new tasks every "timeInterval".
137+
// The periodic check will discover all undone tasks
138+
// TODO/REVIEW: However some tasks also publish the next items
139+
while (true)
140+
{
141+
try {
142+
_logger.LogInformation("Periodic Check");
143+
queueAwakerTask.Publish(new JObject
144+
{
145+
{ "Type", TaskType.PeriodicCheck.ToString() }
146+
});
147+
} catch (Exception e) {
148+
_logger.LogError(e, "Error in Periodic Check");
149+
}
150+
// Thread.Sleep(timeInterval);
151+
Task.Delay(timeInterval).Wait();
152+
_logger.LogInformation("Pausing {0} minutes before next periodicCheck", periodicCheck);
153+
};
154+
}
155+
static void createTaskQueues() {
156+
_logger.LogInformation("createTaskQueues() -starting");
105157
// Delete any pre-existing queues on rabbitMQ.
106-
RabbitMQConnection rabbitMQ = serviceProvider.GetService<RabbitMQConnection>();
158+
RabbitMQConnection rabbitMQ = _serviceProvider.GetService<RabbitMQConnection>();
107159

108160
// Active queues managed by C# (concurrency > 0) are now purged after the queue is created and before messages are processed
109161

110162
ushort concurrent_videotasks = ToUInt16(Globals.appSettings.MAX_CONCURRENT_VIDEO_TASKS, NO_CONCURRENCY);
111163
ushort concurrent_synctasks = ToUInt16(Globals.appSettings.MAX_CONCURRENT_SYNC_TASKS, MIN_CONCURRENCY);
112164
ushort concurrent_transcriptions = ToUInt16(Globals.appSettings.MAX_CONCURRENT_TRANSCRIPTIONS, MIN_CONCURRENCY);
113-
ushort concurrent_describe_images = 1;
114-
ushort concurrent_describe_videos = 1;
115-
165+
ushort concurrent_describe_images = NO_CONCURRENCY;
166+
ushort concurrent_describe_videos = NO_CONCURRENCY;
116167

117168
// Create and start consuming from all queues. If concurrency >=1 the queues are purged
118169

119-
120170
// Upstream Sync related
121171
_logger.LogInformation($"Creating DownloadPlaylistInfoTask & DownloadMediaTask consumers. Concurrency={concurrent_synctasks} ");
122-
serviceProvider.GetService<DownloadPlaylistInfoTask>().Consume(concurrent_synctasks);
123-
serviceProvider.GetService<DownloadMediaTask>().Consume(concurrent_synctasks);
172+
_serviceProvider.GetService<DownloadPlaylistInfoTask>().Consume(concurrent_synctasks);
173+
_serviceProvider.GetService<DownloadMediaTask>().Consume(concurrent_synctasks);
124174

125175
// Transcription Related
126176
_logger.LogInformation($"Creating TranscriptionTask consumers. Concurrency={concurrent_transcriptions} ");
127177

128-
serviceProvider.GetService<TranscriptionTask>().Consume(concurrent_transcriptions);
178+
_serviceProvider.GetService<TranscriptionTask>().Consume(concurrent_transcriptions);
129179

130-
// no more! - serviceProvider.GetService<GenerateVTTFileTask>().Consume(concurrent_transcriptions);
180+
// no more! - _serviceProvider.GetService<GenerateVTTFileTask>().Consume(concurrent_transcriptions);
131181

132182
// Video Processing Related
133183
_logger.LogInformation($"Creating ProcessVideoTask consumer. Concurrency={concurrent_videotasks} ");
134-
serviceProvider.GetService<ProcessVideoTask>().Consume(concurrent_videotasks);
184+
_serviceProvider.GetService<ProcessVideoTask>().Consume(concurrent_videotasks);
135185
// Descriptions
136-
serviceProvider.GetService<DescribeVideoTask>().Consume(concurrent_describe_videos);
137-
serviceProvider.GetService<DescribeImageTask>().Consume(concurrent_describe_images);
138-
139-
186+
_serviceProvider.GetService<DescribeVideoTask>().Consume(concurrent_describe_videos);
187+
_serviceProvider.GetService<DescribeImageTask>().Consume(concurrent_describe_images);
140188

141189
// SceneDetection now handled by native Python
142190
// See https://github.com/classtranscribe/pyapi
143-
serviceProvider.GetService<SceneDetectionTask>().Consume(DISABLED_TASK);
191+
_serviceProvider.GetService<SceneDetectionTask>().Consume(DISABLED_TASK);
144192

145193
// We dont want concurrency for these tasks
146194
_logger.LogInformation("Creating QueueAwakerTask and Box token tasks consumers.");
147-
serviceProvider.GetService<QueueAwakerTask>().Consume(NO_CONCURRENCY); //TODO TOREVIEW: NO_CONCURRENCY?
148-
// does nothing at the moment serviceProvider.GetService<UpdateBoxTokenTask>().Consume(NO_CONCURRENCY);
149-
serviceProvider.GetService<CreateBoxTokenTask>().Consume(NO_CONCURRENCY); // calls _box.CreateAccessTokenAsync(authCode);
195+
_serviceProvider.GetService<QueueAwakerTask>().Consume(NO_CONCURRENCY); //TODO TOREVIEW: NO_CONCURRENCY?
196+
// does nothing at the moment _serviceProvider.GetService<UpdateBoxTokenTask>().Consume(NO_CONCURRENCY);
197+
_serviceProvider.GetService<CreateBoxTokenTask>().Consume(NO_CONCURRENCY); // calls _box.CreateAccessTokenAsync(authCode);
150198

151199
// Elastic Search index should be built after TranscriptionTask
152-
serviceProvider.GetService<BuildElasticIndexTask>().Consume(NO_CONCURRENCY);
200+
_serviceProvider.GetService<BuildElasticIndexTask>().Consume(NO_CONCURRENCY);
153201

154202
// Outdated Elastic Search index would be removed
155-
serviceProvider.GetService<CleanUpElasticIndexTask>().Consume(NO_CONCURRENCY);
203+
_serviceProvider.GetService<CleanUpElasticIndexTask>().Consume(NO_CONCURRENCY);
156204

157-
serviceProvider.GetService<ExampleTask>().Consume(NO_CONCURRENCY);
205+
_serviceProvider.GetService<ExampleTask>().Consume(NO_CONCURRENCY);
158206

159-
serviceProvider.GetService<PythonCrawlerTask>().Consume(DISABLED_TASK);
160-
161-
_logger.LogInformation("Done creating task consumers");
162-
//nolonger used :
163-
// nope serviceProvider.GetService<nope ConvertVideoToWavTask>().Consume(concurrent_videotasks);
164-
165-
bool hacktest = false;
166-
if (hacktest)
167-
{
168-
TempCode tempCode = serviceProvider.GetService<TempCode>();
169-
tempCode.Temp();
170-
return;
171-
}
172-
_logger.LogInformation("All done!");
173-
174-
QueueAwakerTask queueAwakerTask = serviceProvider.GetService<QueueAwakerTask>();
175-
176-
int periodicCheck = Math.Max(1,Convert.ToInt32(Globals.appSettings.PERIODIC_CHECK_EVERY_MINUTES));
177-
int initialPauseMinutes = Math.Max(1, Convert.ToInt32(Globals.appSettings.INITIAL_TASKENGINE_PAUSE_MINUTES));
178-
179-
_logger.LogInformation("Periodic Check Every {0} minutes", periodicCheck);
180-
var timeInterval = new TimeSpan(0, periodicCheck, 0);
181-
182-
var initialPauseInterval = new TimeSpan(0, initialPauseMinutes, 0);
183-
_logger.LogInformation("Pausing {0} minutes before first periodicCheck", initialPauseInterval);
184-
185-
// Thread.Sleep(initialPauseInterval);
186-
Task.Delay(initialPauseInterval).Wait();
187-
// Check for new tasks every "timeInterval".
188-
// The periodic check will discover all undone tasks
189-
// TODO/REVIEW: However some tasks also publish the next items
190-
while (true)
191-
{
192-
193-
queueAwakerTask.Publish(new JObject
194-
{
195-
{ "Type", TaskType.PeriodicCheck.ToString() }
196-
});
197-
// Thread.Sleep(timeInterval);
198-
Task.Delay(timeInterval).Wait();
199-
};
207+
_serviceProvider.GetService<PythonCrawlerTask>().Consume(DISABLED_TASK);
208+
_logger.LogInformation("createTaskQueues() - Done creating task consumers");
200209
}
201-
202210
// Catch all unhandled exceptions.
203211
static void ExceptionHandler(object sender, UnhandledExceptionEventArgs args)
204212
{
205213
Exception e = (Exception)args.ExceptionObject;
206-
_logger.LogError(e, "Unhandled Exception Caught");
214+
Console.WriteLine($"Unhandled Exception Caught {e.Message}\n{e}\nSender:{sender ?? "null"}");
215+
if(_logger !=null){
216+
_logger.LogError(e, "Unhandled Exception Caught");
217+
}
207218
}
208219

209220
private static ushort ToUInt16(String val, ushort defaultVal)

0 commit comments

Comments
 (0)