Note there is earlier support for the script daemon, but works best on version 2.5.43+
Note: here is an example of kicking off multiple jobs at the same time and waiting for them to finish and checking status
Simple job dependency
Have a couple of jobs. Set their schedule to not fire (e.g. in 2099)
0 0 6 * * ? 2099
Set the diagnostics to ignore: /grouper/status?diagnosticType=all
grouper.properties
ws.diagnostic.ignore.loader_SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33 = true ws.diagnostic.ignore.loader_SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f = true
add a script daemon
script is (get job name from daemon screen, NOTE: other loaderRunOneJob examples can be found at https://spaces.at.internet2.edu/display/Grouper/GrouperShell+(gsh)#GrouperShell(gsh)-Loader )
loaderRunOneJob("SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"); loaderRunOneJob("SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f");
Run the new daemon
See that it ran the other two loader sequentially
Daemon job message
scriptType: gsh scriptSource: loaderRunOneJob("SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"); loaderRunOneJob("SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"); groovy:001> loaderRunOneJob("SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"); ===> loader ran successfully, inserted 0 memberships, deleted 0 memberships, total membership count: 3, unresolvable subjects: 0 groovy:002> loaderRunOneJob("SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"); ===> loader ran successfully, inserted 0 memberships, deleted 0 memberships, total membership count: 3, unresolvable subjects: 0
Job dependency with conditional
Here is a sample script ( NOTE: Hib3GrouperLoaderLog.retrieveMostRecentLog is available in versions 2.5.43+ )
import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouper.app.loader.OtherJobScript; long startMillis = System.currentTimeMillis(); String job1name = "SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"; String job2name = "SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"; // run the first job loaderRunOneJob(job1name); // get the most recent loader log for job 1 Hib3GrouperLoaderLog hib3GrouperLoaderLog = Hib3GrouperLoaderLog.retrieveMostRecentLog(job1name); GrouperUtil.assertion(hib3GrouperLoaderLog.getLastUpdated().getTime() > startMillis, "Cant find job1 log!"); GrouperUtil.assertion("SUCCESS".equals(hib3GrouperLoaderLog.getStatus()), "Job1 not SUCCESS!"); // if the total records were greater than 2, then run job 2 if (GrouperUtil.intValue(hib3GrouperLoaderLog.getTotalCount(), 0) > 2) { loaderRunOneJob(job2name); OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("SUCCESS: ran job 1 and 2"); } else { OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("WARNING: ran job 1 but had less than 2 total records (" + hib3GrouperLoaderLog.getTotalCount() + ") so not running job 2"); }
Configure job
Run the new daemon, sample job output when success
SUCCESS: ran job 1 and 2 scriptType: gsh scriptSource: import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouper.app.loader.Othe... groovy:001> import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; groovy:002> import edu.internet2.middleware.grouper.util.GrouperUtil; groovy:003> import edu.internet2.middleware.grouper.app.loader.OtherJobScript; groovy:004> groovy:005> long startMillis = System.currentTimeMillis(); ===> 1613841465448 groovy:006> groovy:007> String job1name = "SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"; ===> SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33 groovy:008> String job2name = "SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"; ===> SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f groovy:009> groovy:010> // run the first job groovy:011> loaderRunOneJob(job1name); ===> loader ran successfully, inserted 0 memberships, deleted 0 memberships, total membership count: 3, unresolvable subjects: 0 groovy:012> groovy:013> // get the most recent loader log for job 1 groovy:014> Hib3GrouperLoaderLog hib3GrouperLoaderLog = Hib3GrouperLoaderLog.retrieveMostRecentLog(job1name); ===> edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog@6522c248 groovy:015> GrouperUtil.assertion(hib3GrouperLoaderLog.getLastUpdated().getTime() > startMillis, "Cant find job1 log!"); groovy:016> GrouperUtil.assertion("SUCCESS".equals(hib3GrouperLoaderLog.getStatus()), "Job1 not SUCCESS!"); groovy:017> groovy:018> // if the total records were greater than 2, then run job 2 groovy:019> if (GrouperUtil.intValue(hib3GrouperLoaderLog.getTotalCount(), 0) > 2) { groovy:020> loaderRunOneJob(job2name); groovy:021> OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("SUCCESS: ran job 1 and 2"); groovy:022> } else { groovy:023> OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("WARNING: ran job 1 but had less than 2 total records (" + hib3GrouperLoaderLog.getTotalCount() + ") so not running job 2"); groovy:024> }
Make the first job have fewer total results and run
WARNING: ran job 1 but had less than 2 total records (0) so not running job 2 scriptType: gsh scriptSource: import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouper.app.loader.Othe... groovy:001> import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; groovy:002> import edu.internet2.middleware.grouper.util.GrouperUtil; groovy:003> import edu.internet2.middleware.grouper.app.loader.OtherJobScript; groovy:004> groovy:005> long startMillis = System.currentTimeMillis(); ===> 1613841870966 groovy:006> groovy:007> String job1name = "SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"; ===> SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33 groovy:008> String job2name = "SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"; ===> SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f groovy:009> groovy:010> // run the first job groovy:011> loaderRunOneJob(job1name); ===> loader ran successfully, inserted 0 memberships, deleted 0 memberships, total membership count: 0, unresolvable subjects: 0 groovy:012> groovy:013> // get the most recent loader log for job 1 groovy:014> Hib3GrouperLoaderLog hib3GrouperLoaderLog = Hib3GrouperLoaderLog.retrieveMostRecentLog(job1name); ===> edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog@5933df9b groovy:015> GrouperUtil.assertion(hib3GrouperLoaderLog.getLastUpdated().getTime() > startMillis, "Cant find job1 log!"); groovy:016> GrouperUtil.assertion("SUCCESS".equals(hib3GrouperLoaderLog.getStatus()), "Job1 not SUCCESS!"); groovy:017> groovy:018> // if the total records were greater than 2, then run job 2 groovy:019> if (GrouperUtil.intValue(hib3GrouperLoaderLog.getTotalCount(), 0) > 2) { groovy:020> loaderRunOneJob(job2name); groovy:021> OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("SUCCESS: ran job 1 and 2"); groovy:022> } else { groovy:023> OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("WARNING: ran job 1 but had less than 2 total records (" + hib3GrouperLoaderLog.getTotalCount() + ") so not running job 2"); groovy:024> }
Make first job fail
java.lang.IllegalArgumentException: Error when handling error: Error while running line number 11 command ( loaderRunOneJob(job1name);), , Script (8k max): import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouper.app.loader.OtherJobScript; long startMillis = System.currentTimeMillis(); String job1name = "SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"; String job2name = "SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"; // run the first job loaderRunOneJob(job1name); // get the most recent loader log for job 1 Hib3GrouperLoaderLog hib3GrouperLoaderLog = Hib3GrouperLoaderLog.retrieveMostRecentLog(job1name); GrouperUtil.assertion(hib3GrouperLoaderLog.getLastUpdated().getTime() > startMillis, "Cant find job1 log!"); GrouperUtil.assertion("SUCCESS".equals(hib3GrouperLoaderLog.getStatus()), "Job1 not SUCCESS!"); // if the total records were greater than 2, then run job 2 if (GrouperUtil.intValue(hib3GrouperLoaderLog.getTotalCount(), 0) > 2) { loaderRunOneJob(job2name); OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("SUCCESS: ran job 1 and 2"); } else { OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setJobMessage("WARNING: ran job 1 but had less than 2 total records (" + hib3GrouperLoaderLog.getTotalCount() + ") so not running job 2"); }, Output (10k max): groovy:001> import edu.internet2.middleware.grouper.app.loader.db.Hib3GrouperLoaderLog; groovy:002> import edu.internet2.middleware.grouper.util.GrouperUtil; groovy:003> import edu.internet2.middleware.grouper.app.loader.OtherJobScript; groovy:004> groovy:005> long startMillis = System.currentTimeMillis(); ===> 1613841962804 groovy:006> groovy:007> String job1name = "SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33"; ===> SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33 groovy:008> String job2name = "SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f"; ===> SQL_SIMPLE__test:loader2__6fdfe4ded07849bbb34d42683a04368f groovy:009> groovy:010> // run the first job groovy:011> loaderRunOneJob(job1name); java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: Problem with query: select name as subject_identifier from grouper_groups where name like '%left%' and sdfasdf, on db: DB: user: sa, url: jdbc:hsqldb:hsql://localhost:9001/grouper, driver: org.hsqldb.jdbcDriver, jobName: SQL_SIMPLE__test:loader1__2a5294db09864b50abc976ae44752d33, Error while running line number 11 command ( loaderRunOneJob(job1name);), at edu.internet2.middleware.grouper.app.loader.GrouperLoader.runOnceByJobName(GrouperLoader.java:1742) at edu.internet2.middleware.grouper.app.loader.GrouperLoader.runOnceByJobName(GrouperLoader.java:1686) at edu.internet2.middleware.grouper.app.gsh.loaderRunOneJob.invoke(loaderRunOneJob.java:95) at edu.internet2.middleware.grouper.app.gsh.loaderRunOneJob$invoke.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) at groovysh_evaluate.loaderRunOneJob(groovysh_evaluate:4) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at groovy.lang.