Some data becomes updated in an in-memory datastore by retrieving data by a rest/remote API:
- once on application start up listening an
ApplicationReadyEvent - periodically in a job
Both hooks are using the same method in a springboot component which uses the UnconstrainedDataManager.
The datastore update triggered by the application event always works fine. The job triggered update process works on some days, on others it complains about unset authentication:
Success (e.g. yesterday):
2023-05-22 05:17:00.203 INFO [k-app,292d1b33b34e7699,292d1b33b34e7699] 867 --- [quartzScheduler_Worker-10] c.c.app.kapp.job.UpdateRemoteDataJob : Fetched remote data. Updating transient store...
2023-05-22 05:17:00.847 INFO [k-app,292d1b33b34e7699,292d1b33b34e7699] 867 --- [quartzScheduler_Worker-10] c.c.app.kapp.job.UpdateRemoteDataJob : Updating transient store successfully.
Failure (e.g. today):
2023-05-23 05:17:00.181 INFO [k-app,fe220a45bdbe5d80,fe220a45bdbe5d80] 867 --- [quartzScheduler_Worker-2] c.c.app.kapp.job.UpdateRemoteDataJob : Fetched remote data. Updating transient store...
2023-05-23 05:17:00.243 ERROR [k-app,fe220a45bdbe5d80,fe220a45bdbe5d80] 867 --- [quartzScheduler_Worker-2] c.c.addon.ctl.service.RemoteDataService : Could not update datastore. Authentication is not set. Use SystemAuthenticator in non-user requests like schedulers or asynchronous calls.
java.lang.IllegalStateException: Authentication is not set. Use SystemAuthenticator in non-user requests like schedulers or asynchronous calls.
at io.jmix.core.security.impl.CurrentAuthenticationImpl.getAuthentication(CurrentAuthenticationImpl.java:47) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.security.impl.constraint.AuthenticationPolicyStore.extractFromAuthenticationByScope(AuthenticationPolicyStore.java:123) ~[jmix-security-1.4.4.jar!/:na]
at io.jmix.security.impl.constraint.AuthenticationPolicyStore.getEntityResourcePolicies(AuthenticationPolicyStore.java:69) ~[jmix-security-1.4.4.jar!/:na]
at io.jmix.security.impl.constraint.SecureOperationsImpl.isEntityOperationPermitted(SecureOperationsImpl.java:57) ~[jmix-security-1.4.4.jar!/:na]
at io.jmix.security.impl.constraint.SecureOperationsImpl.isEntityCreatePermitted(SecureOperationsImpl.java:36) ~[jmix-security-1.4.4.jar!/:na]
at io.jmix.securityui.constraint.UiEntityConstraint.applyTo(UiEntityConstraint.java:52) ~[jmix-security-ui-1.4.4.jar!/:na]
at io.jmix.securityui.constraint.UiEntityConstraint.applyTo(UiEntityConstraint.java:28) ~[jmix-security-ui-1.4.4.jar!/:na]
at io.jmix.core.AccessManager.lambda$applyConstraints$2(AccessManager.java:77) ~[jmix-core-1.4.4.jar!/:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na]
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
at io.jmix.core.AccessManager.applyConstraints(AccessManager.java:76) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.core.AccessManager.applyRegisteredConstraints(AccessManager.java:86) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.ui.action.list.ViewAction.isPermitted(ViewAction.java:257) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.ui.action.BaseAction.refreshState(BaseAction.java:148) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.ui.component.impl.AbstractTable.refreshActionsState(AbstractTable.java:1315) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.ui.component.impl.AbstractTable.tableSourcePropertyValueChanged(AbstractTable.java:1756) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.ui.component.table.TableDataContainer.datasourceValueChanged(TableDataContainer.java:301) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.core.common.event.EventHub.publish(EventHub.java:170) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.ui.component.data.table.ContainerTableItems.containerItemPropertyChanged(ContainerTableItems.java:79) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.core.common.event.EventHub.publish(EventHub.java:170) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.ui.model.impl.InstanceContainerImpl.itemPropertyChanged(InstanceContainerImpl.java:182) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.ui.model.impl.CollectionContainerImpl.itemPropertyChanged(CollectionContainerImpl.java:231) ~[jmix-ui-1.4.4.jar!/:na]
at io.jmix.core.entity.BaseEntityEntry.firePropertyChanged(BaseEntityEntry.java:198) ~[jmix-core-1.4.4.jar!/:na]
at io.jmix.core.impl.EntityInternals.fireListeners(EntityInternals.java:90) ~[jmix-core-1.4.4.jar!/:na]
...
at c.c.addon.ctl.service.RemoteDataService.updateDataStore(RemoteDataService.java:800) ~[ctl-1.4.5.jar!/:1.4.5]
at com.company.app.kapp.job.UpdateRemoteDataJob.execute(UpdateRemoteDataJob.java:50) ~[classes!/:2.4.2]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.3.2.jar!/:na]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) ~[quartz-2.3.2.jar!/:na]
2023-05-23 05:17:00.243 ERROR [kapp,fe220a45bdbe5d80,fe220a45bdbe5d80] 867 --- [quartzScheduler_Worker-2] c.c.app.kapp.job.UpdateRemoteDataJob : Updating transient store failed
- Do I need to set system authentication explicitly even when using an unconstrained data manager?
- Why does it work on one day but does not on another?
- I wonder, why user interaction related code is involved in a scheduler triggered thread.