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.