@@ -33,14 +33,32 @@ class Program
33
33
public static ServiceProvider _serviceProvider ;
34
34
public static ILogger < Program > _logger ;
35
35
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 ( )
36
53
{
37
54
var configuration = CTDbContext . GetConfigurations ( ) ;
38
55
39
56
// This project relies on Dependency Injection to configure its various services,
40
57
// For more info, https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1
41
58
// All the services used are configured using the service provider.
59
+ Console . WriteLine ( "SetupServices() - starting" ) ;
42
60
43
- var serviceProvider = new ServiceCollection ( )
61
+ _serviceProvider = new ServiceCollection ( )
44
62
. AddLogging ( builder =>
45
63
{
46
64
builder . AddConsole ( ) ;
@@ -84,10 +102,9 @@ public static void Main()
84
102
. AddSingleton < TempCode > ( )
85
103
. BuildServiceProvider ( ) ;
86
104
87
- _serviceProvider = serviceProvider ;
88
- _logger = serviceProvider . GetRequiredService < ILogger < Program > > ( ) ;
105
+ _logger = _serviceProvider . GetRequiredService < ILogger < Program > > ( ) ;
89
106
90
- Globals . appSettings = serviceProvider . GetService < IOptions < AppSettings > > ( ) . Value ;
107
+ Globals . appSettings = _serviceProvider . GetService < IOptions < AppSettings > > ( ) . Value ;
91
108
TaskEngineGlobals . KeyProvider = new KeyProvider ( Globals . appSettings ) ;
92
109
93
110
AppDomain currentDomain = AppDomain . CurrentDomain ;
@@ -96,114 +113,108 @@ public static void Main()
96
113
_logger . LogInformation ( "Seeding database" ) ;
97
114
98
115
// Seed the database, with some initial data.
99
- Seeder seeder = serviceProvider . GetService < Seeder > ( ) ;
116
+ Seeder seeder = _serviceProvider . GetService < Seeder > ( ) ;
100
117
seeder . Seed ( ) ;
118
+ }
101
119
102
- _logger . LogInformation ( "Starting TaskEngine" ) ;
120
+
121
+ static void runQueueAwakerForever ( ) {
122
+ _logger . LogInformation ( "runQueueAwakerForever - start" ) ;
123
+ QueueAwakerTask queueAwakerTask = _serviceProvider . GetService < QueueAwakerTask > ( ) ;
103
124
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 ) ) ;
104
127
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" ) ;
105
157
// Delete any pre-existing queues on rabbitMQ.
106
- RabbitMQConnection rabbitMQ = serviceProvider . GetService < RabbitMQConnection > ( ) ;
158
+ RabbitMQConnection rabbitMQ = _serviceProvider . GetService < RabbitMQConnection > ( ) ;
107
159
108
160
// Active queues managed by C# (concurrency > 0) are now purged after the queue is created and before messages are processed
109
161
110
162
ushort concurrent_videotasks = ToUInt16 ( Globals . appSettings . MAX_CONCURRENT_VIDEO_TASKS , NO_CONCURRENCY ) ;
111
163
ushort concurrent_synctasks = ToUInt16 ( Globals . appSettings . MAX_CONCURRENT_SYNC_TASKS , MIN_CONCURRENCY ) ;
112
164
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 ;
116
167
117
168
// Create and start consuming from all queues. If concurrency >=1 the queues are purged
118
169
119
-
120
170
// Upstream Sync related
121
171
_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 ) ;
124
174
125
175
// Transcription Related
126
176
_logger . LogInformation ( $ "Creating TranscriptionTask consumers. Concurrency={ concurrent_transcriptions } ") ;
127
177
128
- serviceProvider . GetService < TranscriptionTask > ( ) . Consume ( concurrent_transcriptions ) ;
178
+ _serviceProvider . GetService < TranscriptionTask > ( ) . Consume ( concurrent_transcriptions ) ;
129
179
130
- // no more! - serviceProvider .GetService<GenerateVTTFileTask>().Consume(concurrent_transcriptions);
180
+ // no more! - _serviceProvider .GetService<GenerateVTTFileTask>().Consume(concurrent_transcriptions);
131
181
132
182
// Video Processing Related
133
183
_logger . LogInformation ( $ "Creating ProcessVideoTask consumer. Concurrency={ concurrent_videotasks } ") ;
134
- serviceProvider . GetService < ProcessVideoTask > ( ) . Consume ( concurrent_videotasks ) ;
184
+ _serviceProvider . GetService < ProcessVideoTask > ( ) . Consume ( concurrent_videotasks ) ;
135
185
// 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 ) ;
140
188
141
189
// SceneDetection now handled by native Python
142
190
// See https://github.com/classtranscribe/pyapi
143
- serviceProvider . GetService < SceneDetectionTask > ( ) . Consume ( DISABLED_TASK ) ;
191
+ _serviceProvider . GetService < SceneDetectionTask > ( ) . Consume ( DISABLED_TASK ) ;
144
192
145
193
// We dont want concurrency for these tasks
146
194
_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);
150
198
151
199
// Elastic Search index should be built after TranscriptionTask
152
- serviceProvider . GetService < BuildElasticIndexTask > ( ) . Consume ( NO_CONCURRENCY ) ;
200
+ _serviceProvider . GetService < BuildElasticIndexTask > ( ) . Consume ( NO_CONCURRENCY ) ;
153
201
154
202
// Outdated Elastic Search index would be removed
155
- serviceProvider . GetService < CleanUpElasticIndexTask > ( ) . Consume ( NO_CONCURRENCY ) ;
203
+ _serviceProvider . GetService < CleanUpElasticIndexTask > ( ) . Consume ( NO_CONCURRENCY ) ;
156
204
157
- serviceProvider . GetService < ExampleTask > ( ) . Consume ( NO_CONCURRENCY ) ;
205
+ _serviceProvider . GetService < ExampleTask > ( ) . Consume ( NO_CONCURRENCY ) ;
158
206
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" ) ;
200
209
}
201
-
202
210
// Catch all unhandled exceptions.
203
211
static void ExceptionHandler ( object sender , UnhandledExceptionEventArgs args )
204
212
{
205
213
Exception e = ( Exception ) args . ExceptionObject ;
206
- _logger . LogError ( e , "Unhandled Exception Caught" ) ;
214
+ Console . WriteLine ( $ "Unhandled Exception Caught { e . Message } \n { e } \n Sender:{ sender ?? "null" } ") ;
215
+ if ( _logger != null ) {
216
+ _logger . LogError ( e , "Unhandled Exception Caught" ) ;
217
+ }
207
218
}
208
219
209
220
private static ushort ToUInt16 ( String val , ushort defaultVal )
0 commit comments