@@ -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 } \n Sender:{ 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