2424import org .springframework .scheduling .support .CronTrigger ;
2525import org .springframework .stereotype .Component ;
2626
27+ import org .apache .log4j .Logger ;
28+
2729import javax .annotation .PostConstruct ;
30+ import java .util .ArrayList ;
2831import java .util .List ;
2932
3033@ Component
3134@ EnableScheduling
3235@ ConditionalOnProperty (value = "avni.int.auto.close" , havingValue = "false" )
3336public class IntegrationJobScheduler {
37+ private static final Logger logger = Logger .getLogger (IntegrationJobScheduler .class );
38+
3439 private final AvniGoonjMainJob avniGoonjMainJob ;
3540 private final AvniGoonjFullErrorJob avniGoonjFullErrorJob ;
3641 private final AvniPowerMainJob avniPowerMainJob ;
@@ -56,6 +61,8 @@ public class IntegrationJobScheduler {
5661 private String amritCron ;
5762 @ Value ("${amrit.app.cron.full.error}" )
5863 private String amritCronError ;
64+ @ Value ("${avni.int.env:#{null}}" )
65+ private String currentEnvironment ;
5966
6067 @ Autowired
6168 public IntegrationJobScheduler (AvniGoonjMainJob avniGoonjMainJob , AvniGoonjFullErrorJob avniGoonjFullErrorJob ,
@@ -80,55 +87,188 @@ public IntegrationJobScheduler(AvniGoonjMainJob avniGoonjMainJob, AvniGoonjFullE
8087
8188 @ PostConstruct
8289 public void scheduleAll () {
83- schedulePower ();
84- scheduleLahi ();
85- scheduleRwb ();
86- scheduleAmrit ();
87- scheduleGoonj ();
90+ logger .info ("========== INTEGRATION SERVICE STARTUP - SCHEDULING JOBS ==========" );
91+ List <String > activeModules = new ArrayList <>();
92+ List <String > skippedModules = new ArrayList <>();
93+
94+ if (schedulePower ()) activeModules .add ("Power" ); else skippedModules .add ("Power" );
95+ if (scheduleLahi ()) activeModules .add ("Lahi" ); else skippedModules .add ("Lahi" );
96+ if (scheduleRwb ()) activeModules .add ("RWB" ); else skippedModules .add ("RWB" );
97+ if (scheduleAmrit ()) activeModules .add ("Amrit" ); else skippedModules .add ("Amrit" );
98+ if (scheduleGoonj ()) activeModules .add ("Goonj" ); else skippedModules .add ("Goonj" );
99+
100+ logStartupSummary (activeModules , skippedModules );
101+ }
102+
103+ private void logStartupSummary (List <String > activeModules , List <String > skippedModules ) {
104+ logger .info ("========== INTEGRATION SERVICE STARTUP SUMMARY ==========" );
105+ logger .info (String .format ("Active modules (%d): %s" , activeModules .size (),
106+ activeModules .isEmpty () ? "NONE" : String .join (", " , activeModules )));
107+ logger .info (String .format ("Skipped modules (%d): %s" , skippedModules .size (),
108+ skippedModules .isEmpty () ? "NONE" : String .join (", " , skippedModules )));
109+ logger .info ("==========================================================" );
88110 }
89111
90- private void scheduleGoonj () {
112+ private boolean scheduleGoonj () {
113+ logger .info ("--- Goonj Module ---" );
91114 List <IntegrationSystem > goonjSystems = integrationSystemRepository .findAllBySystemType (IntegrationSystem .IntegrationSystemType .Goonj );
92- goonjSystems .forEach (goonjSystem -> {
115+ if (goonjSystems .isEmpty ()) {
116+ logger .info ("Goonj: No integration systems found in DB" );
117+ return false ;
118+ }
119+
120+ boolean anyScheduled = false ;
121+ for (IntegrationSystem goonjSystem : goonjSystems ) {
93122 IntegrationSystemConfigCollection integrationSystemConfigs = integrationSystemConfigRepository .getInstanceConfiguration (goonjSystem );
94123 GoonjConfig goonjConfig = new GoonjConfig (integrationSystemConfigs , goonjSystem );
124+
125+ if (!validateEnvironment (goonjSystem .getName (), goonjConfig .getEnvironment ())) {
126+ continue ;
127+ }
128+
95129 String mainScheduledJobCron = integrationSystemConfigs .getMainScheduledJobCron ();
96130 String errorScheduledJobCron = integrationSystemConfigs .getErrorScheduledJobCron ();
131+ String tasks = goonjConfig .getTasks ();
132+
133+ logger .info (String .format ("Goonj [%s]: Scheduling jobs - mainCron: %s, errorCron: %s, tasks: %s" ,
134+ goonjSystem .getName (), mainScheduledJobCron , errorScheduledJobCron , tasks ));
97135
98- if (CronExpression .isValidExpression (mainScheduledJobCron ))
136+ if (CronExpression .isValidExpression (mainScheduledJobCron )) {
99137 taskScheduler .schedule (() -> avniGoonjMainJob .execute (goonjConfig ), new CronTrigger (mainScheduledJobCron ));
138+ logger .info (String .format ("Goonj [%s]: Main job SCHEDULED with cron: %s" , goonjSystem .getName (), mainScheduledJobCron ));
139+ anyScheduled = true ;
140+ } else {
141+ logger .info (String .format ("Goonj [%s]: Main job SKIPPED - invalid cron: %s" , goonjSystem .getName (), mainScheduledJobCron ));
142+ }
100143
101- if (CronExpression .isValidExpression (errorScheduledJobCron ))
144+ if (CronExpression .isValidExpression (errorScheduledJobCron )) {
102145 taskScheduler .schedule (() -> avniGoonjFullErrorJob .execute (goonjConfig ), new CronTrigger (errorScheduledJobCron ));
103- });
146+ logger .info (String .format ("Goonj [%s]: Error job SCHEDULED with cron: %s" , goonjSystem .getName (), errorScheduledJobCron ));
147+ anyScheduled = true ;
148+ } else {
149+ logger .info (String .format ("Goonj [%s]: Error job SKIPPED - invalid cron: %s" , goonjSystem .getName (), errorScheduledJobCron ));
150+ }
151+ }
152+ return anyScheduled ;
104153 }
105154
106- private void scheduleAmrit () {
107- if (CronExpression .isValidExpression (amritCron )) taskScheduler .schedule (avniAmritMainJob ::execute , new CronTrigger (amritCron ));
108- if (CronExpression .isValidExpression (amritCronError )) taskScheduler .schedule (avniAmritFullErrorJob ::execute , new CronTrigger (amritCronError ));
155+ private boolean validateEnvironment (String systemName , String dbEnv ) {
156+ if (currentEnvironment == null || currentEnvironment .isBlank ()) {
157+ logger .warn (String .format ("%s integration SKIPPED: avni.int.env property not set. " +
158+ "Set this property to match the DB config int_env to enable integration." , systemName ));
159+ return false ;
160+ }
161+
162+ if (dbEnv == null || dbEnv .isBlank ()) {
163+ logger .warn (String .format ("%s integration SKIPPED: int_env not configured in DB. " +
164+ "Configure int_env in integration_system_config table to enable integration." , systemName ));
165+ return false ;
166+ }
167+
168+ if (!currentEnvironment .equals (dbEnv )) {
169+ logger .error (String .format ("%s integration SKIPPED: Environment mismatch detected! " +
170+ "Current environment (from env): '%s', DB config environment: '%s'. " +
171+ "This likely indicates a non-prod environment using prod DB config. " +
172+ "Either update the avni.int.env property or clean up the DB integration config." ,
173+ systemName , currentEnvironment , dbEnv ));
174+ return false ;
175+ }
176+
177+ logger .info (String .format ("%s environment validation passed. Environment: %s" , systemName , currentEnvironment ));
178+ return true ;
109179 }
110180
111- private void scheduleLahi () {
112- if (CronExpression .isValidExpression (lahiCron )) taskScheduler .schedule (avniLahiMainJob ::execute , new CronTrigger (lahiCron ));
113- if (CronExpression .isValidExpression (lahiCronError )) taskScheduler .schedule (avniLahiFullErrorJob ::execute , new CronTrigger (lahiCronError ));
181+ private boolean isRwbEnvironmentValid (RwbConfig rwbConfig ) {
182+ return validateEnvironment (rwbConfig .getIntegrationSystem ().getName (), rwbConfig .getEnvironment ());
114183 }
115184
116- private void schedulePower () {
117- if (CronExpression .isValidExpression (powerCron )) taskScheduler .schedule (avniPowerMainJob ::execute , new CronTrigger (powerCron ));
118- if (CronExpression .isValidExpression (powerCronError )) taskScheduler .schedule (avniPowerFullErrorJob ::execute , new CronTrigger (powerCronError ));
185+ private boolean scheduleAmrit () {
186+ logger .info ("--- Amrit Module ---" );
187+ boolean scheduled = false ;
188+ if (CronExpression .isValidExpression (amritCron )) {
189+ taskScheduler .schedule (avniAmritMainJob ::execute , new CronTrigger (amritCron ));
190+ logger .info (String .format ("Amrit: Main job SCHEDULED with cron: %s" , amritCron ));
191+ scheduled = true ;
192+ } else {
193+ logger .info (String .format ("Amrit: Main job SKIPPED - invalid cron: %s" , amritCron ));
194+ }
195+ if (CronExpression .isValidExpression (amritCronError )) {
196+ taskScheduler .schedule (avniAmritFullErrorJob ::execute , new CronTrigger (amritCronError ));
197+ logger .info (String .format ("Amrit: Error job SCHEDULED with cron: %s" , amritCronError ));
198+ scheduled = true ;
199+ } else {
200+ logger .info (String .format ("Amrit: Error job SKIPPED - invalid cron: %s" , amritCronError ));
201+ }
202+ return scheduled ;
119203 }
120204
205+ private boolean scheduleLahi () {
206+ logger .info ("--- Lahi Module ---" );
207+ boolean scheduled = false ;
208+ if (CronExpression .isValidExpression (lahiCron )) {
209+ taskScheduler .schedule (avniLahiMainJob ::execute , new CronTrigger (lahiCron ));
210+ logger .info (String .format ("Lahi: Main job SCHEDULED with cron: %s" , lahiCron ));
211+ scheduled = true ;
212+ } else {
213+ logger .info (String .format ("Lahi: Main job SKIPPED - invalid cron: %s" , lahiCron ));
214+ }
215+ if (CronExpression .isValidExpression (lahiCronError )) {
216+ taskScheduler .schedule (avniLahiFullErrorJob ::execute , new CronTrigger (lahiCronError ));
217+ logger .info (String .format ("Lahi: Error job SCHEDULED with cron: %s" , lahiCronError ));
218+ scheduled = true ;
219+ } else {
220+ logger .info (String .format ("Lahi: Error job SKIPPED - invalid cron: %s" , lahiCronError ));
221+ }
222+ return scheduled ;
223+ }
121224
122- private void scheduleRwb () {
225+ private boolean schedulePower () {
226+ logger .info ("--- Power Module ---" );
227+ boolean scheduled = false ;
228+ if (CronExpression .isValidExpression (powerCron )) {
229+ taskScheduler .schedule (avniPowerMainJob ::execute , new CronTrigger (powerCron ));
230+ logger .info (String .format ("Power: Main job SCHEDULED with cron: %s" , powerCron ));
231+ scheduled = true ;
232+ } else {
233+ logger .info (String .format ("Power: Main job SKIPPED - invalid cron: %s" , powerCron ));
234+ }
235+ if (CronExpression .isValidExpression (powerCronError )) {
236+ taskScheduler .schedule (avniPowerFullErrorJob ::execute , new CronTrigger (powerCronError ));
237+ logger .info (String .format ("Power: Error job SCHEDULED with cron: %s" , powerCronError ));
238+ scheduled = true ;
239+ } else {
240+ logger .info (String .format ("Power: Error job SKIPPED - invalid cron: %s" , powerCronError ));
241+ }
242+ return scheduled ;
243+ }
244+
245+ private boolean scheduleRwb () {
246+ logger .info ("--- RWB Module ---" );
123247 List <IntegrationSystem > rwbSystems = integrationSystemRepository .findAllBySystemType (IntegrationSystem .IntegrationSystemType .rwb );
124- rwbSystems .forEach (rwbSystem -> {
248+ if (rwbSystems .isEmpty ()) {
249+ logger .info ("RWB: No integration systems found in DB" );
250+ return false ;
251+ }
252+
253+ boolean anyScheduled = false ;
254+ for (IntegrationSystem rwbSystem : rwbSystems ) {
125255 IntegrationSystemConfigCollection integrationSystemConfigs = integrationSystemConfigRepository .getInstanceConfiguration (rwbSystem );
126256 RwbConfig rwbConfig = new RwbConfig (integrationSystemConfigs , rwbSystem );
257+
258+ if (!isRwbEnvironmentValid (rwbConfig )) {
259+ continue ;
260+ }
261+
127262 String rwbCron = integrationSystemConfigs .getMainScheduledJobCron ();
128263
129264 if (CronExpression .isValidExpression (rwbCron )) {
130265 taskScheduler .schedule (() -> avniRwbMainJob .execute (rwbConfig ), new CronTrigger (rwbCron ));
266+ logger .info (String .format ("RWB [%s]: Main job SCHEDULED with cron: %s" , rwbSystem .getName (), rwbCron ));
267+ anyScheduled = true ;
268+ } else {
269+ logger .info (String .format ("RWB [%s]: Main job SKIPPED - invalid cron: %s" , rwbSystem .getName (), rwbCron ));
131270 }
132- });
271+ }
272+ return anyScheduled ;
133273 }
134274}
0 commit comments