-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
To add support for non-concurrent task execution in a clustered environment #44048
Comments
cc @mkouba |
I may add that the only reason for us to use quartz in the first place is specifically for jobs that are required to execute just once at a time across the whole cluster. for the other timers that execute per pod we use the default quarkus scheduler. |
I do understand your needs. In theory, we could map FYI I've tried to implement a simple (and naive.. yet working ;-) mutex/non-concurrent job with the default/simple scheduler; it's based on the |
I think that we'll need to introduce a new annotation because |
So I have a working solution but it has quite some limitations. TLDR>It only works if Why it won't work with
|
I took a look at the draft and I think that the solution is too restrictive to be useful, although I understand why it is done in such a way and I sadly don't have a better one up my sleeve. The initial comment shows a "workaround" that's actually more flexible as you can keep scheduling other jobs on whichever thread pool you need while offloading these non-concurrent jobs directly to Quartz. OTOH, the draft requires you to explicitly set Ultimately, @vsevel and @vondacho should have the last word on that as you are running this use case. So please, let us know if the draft presented here would help you, or not. And last but not least, Martin's example with mutex implementation should also be taken into consideration as that seems to be applicable to arbitrary scheduled method with Quarkus if need be (or perhaps if you just don't want to go through the Quartz API). |
In theory, we could also turn this POC into a separate extension... but again, I'm not really sure it would be worth it. |
that would not be an issue. we have our own extensions where we can force the apps to set this property.
it would not be an issue, since the workaround does not do any better. we run anyway on the quartz thread, and
this means that we would not get a duplicated context. I checked with the workaround that we can force a request scope. I suppose we would be able to do the same thing with your code change proposition?
virtual thread is already covered at startup (the app fails to start with a clear message)
our original need was to be able to run exclusive timers on quartz, and anything else on the simple scheduler.
we appreciate the effort @mkouba . we believe your proposition brings some decent value. if this feature was available, we would certainly use it, as we would avoid a more complex declaration, and the limitations do not seem to apply, at least in our situation. as our utilization of quartz really revolves around non concurrent jobs, I think your proposition is valuable, assuming this is not bringing too much complexity into the quartz extension. |
It does not bring additional complexity. So I will add a check that would fail at runtime if |
would we be able to offload the execution to a quarkus managed thread (potentially a virtual thread), and block the quarkus thread until the processing returns? |
Hm, that would be possible but I'm not quite sure it's a good idea. I mean, if we do it globally (for all scheduled methods) then we will always block two threads, but most of the time for no good reason. It would also mean that the quartz thread pool would have to be big enough so that it's not a bottleneck. If we only do it for |
that is what I was thinking, and may be only when the blocking property is set. |
Which property do you have in mind?
It is an implementation detail but it might require additional considerations, for example the Quartz thread pool configuration. That said, we could document the impacts in the javadoc of WDYT? @manovotn |
|
Just to make sure I understand this, you're suggesting that with this property set, we handle blocking scheduled jobs so that:
Is that right? If so, I think this could work if we only do that for |
I don't think it makes a lot of sense. If In theory, we could block the quartz thread if |
Yes, that's essentially the same - they key point is that we want to only have this behavior for |
Hm, it's not the same but I get your point. I will adapt my PR then. |
Done. |
the second thread may be a virtual thread. in that case we lock just 1 really. and we were going to execute on it anyway. so we are not really locking anything or wasting resources. what did you end up doing? @mkouba |
We only block the quartz thread if |
ok. and you execute the business method on that quartz thread, or you offload it to a quarkus thread? |
We offload and block the quartz thread until the execution finished. |
that may have been a good thing to introduce a complete new annotation |
I don't think it would be a good idea. |
commit d1394b6 Merge: 52ebb92 c41dfd6 Author: RobinDM <de.mol.robin@gmail.com> Date: Tue Nov 12 08:56:25 2024 +0100 Merge branch 'quarkusio:main' into datasource-devservices-showLogs-squashed commit c41dfd6 Merge: 52286bf 0611099 Author: Georgios Andrianakis <geoand@gmail.com> Date: Tue Nov 12 09:32:18 2024 +0200 Merge pull request quarkusio#44431 from phillip-kruger/filename-openapi Add option to name stored openapi files commit 52286bf Merge: 81679eb 5a2d46c Author: Georgios Andrianakis <geoand@gmail.com> Date: Tue Nov 12 08:08:49 2024 +0200 Merge pull request quarkusio#44299 from Sgitario/41689_good REST Server/Client allows configuring the removal of trailing slashs commit 52ebb92 Merge: 0348db6 81679eb Author: RobinDM <de.mol.robin@gmail.com> Date: Tue Nov 12 06:59:08 2024 +0100 Merge branch 'main' into datasource-devservices-showLogs-squashed commit 0348db6 Author: RobinDM <de.mol.robin@gmail.com> Date: Tue Nov 12 06:58:50 2024 +0100 Update extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java Co-authored-by: George Gastaldi <gegastaldi@gmail.com> commit 81679eb Merge: 10ed7b1 0878a19 Author: George Gastaldi <gegastaldi@gmail.com> Date: Tue Nov 12 00:10:40 2024 -0300 Merge pull request quarkusio#44415 from radcortez/quarkus-44400 Propagate Runtime properties in JBang Dev mode commit 0611099 Author: Phillip Kruger <phillip.kruger@gmail.com> Date: Tue Nov 12 13:54:41 2024 +1100 Add option to name stored openapi files Signed-off-by: Phillip Kruger <phillip.kruger@gmail.com> commit 10ed7b1 Merge: 6329fda f23faa2 Author: Georgios Andrianakis <geoand@gmail.com> Date: Mon Nov 11 19:53:21 2024 +0200 Merge pull request quarkusio#44421 from mariofusco/q44417 Fix deserialization of null maps in reflection-free Jackson deserializers commit 6329fda Merge: e7fb440 8ce3dc5 Author: Andy Damevin <ia3andy@gmail.com> Date: Mon Nov 11 18:36:35 2024 +0100 Merge pull request quarkusio#44416 from mkouba/issue-44412 QuteErrorPageSetup: support templates that are not backed by a file commit e7fb440 Merge: 7a6b0ee 95fea0b Author: Bruno Baptista <brunobat@gmail.com> Date: Mon Nov 11 16:48:59 2024 +0000 Merge pull request quarkusio#43983 from alesj/simplespanprocessor_i29448 Add SimpleSpanProcessor support commit f23faa2 Author: mariofusco <mario.fusco@gmail.com> Date: Mon Nov 11 17:47:29 2024 +0100 Fix deserialization of null maps in reflection-free Jackson deserializers commit 8ce3dc5 Author: Martin Kouba <mkouba@redhat.com> Date: Mon Nov 11 14:56:20 2024 +0100 QuteErrorPageSetup: support templates that are not backed by a file - fixes quarkusio#44412 commit 0878a19 Author: Roberto Cortez <radcortez@yahoo.com> Date: Mon Nov 11 13:37:42 2024 +0000 Propagate Runtime properties in JBang Dev mode commit 95fea0b Author: Ales Justin <ales.justin@gmail.com> Date: Thu Oct 17 12:50:53 2024 +0200 Add SimpleSpanProcessor support commit 7a6b0ee Merge: ddee2e0 686cc7d Author: Clement Escoffier <clement@apache.org> Date: Mon Nov 11 09:03:11 2024 +0100 Merge pull request quarkusio#44351 from cescoffier/workshop-structure-adr Propose ADR for restructuring Quarkus workshops organization commit 686cc7d Author: Clement Escoffier <clement.escoffier@gmail.com> Date: Wed Nov 6 16:28:07 2024 +0100 Propose ADR for restructuring Quarkus workshops organization - Suggests moving from a single repository to individual repositories per workshop - Aims to simplify management, improve discoverability, and enable GitHub Pages for documentation - Addresses limitations of current structure in hosting and maintaining multiple workshops commit ddee2e0 Merge: b3d5937 2ffe012 Author: Martin Kouba <mkouba@redhat.com> Date: Mon Nov 11 08:48:15 2024 +0100 Merge pull request quarkusio#44224 from mkouba/issue-44048 Quartz: introduce Nonconcurrent commit b3d5937 Merge: b5a1eac bd03e6c Author: Phillip Krüger <phillip.kruger@gmail.com> Date: Mon Nov 11 09:28:20 2024 +1100 Merge pull request quarkusio#44407 from michalvavrik/feature/add-roles-allowed-vals-to-openapi Include allowed roles in security scheme scopes when OpenApi version is 3.1.0 or greater commit bd03e6c Author: Michal Vavřík <mvavrik@redhat.com> Date: Sun Nov 10 12:57:36 2024 +0100 Include allowed roles in security scheme scopes in OpenApi 3.1+ commit b5a1eac Merge: 0782ecc 998c3ee Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Sun Nov 10 11:23:33 2024 +0000 Merge pull request quarkusio#44406 from michalvavrik/feature/handle-oidc-extension-deprecations Handle InjectionPointsTransformer deprecations in OIDC extension commit 998c3ee Author: Michal Vavřík <mvavrik@redhat.com> Date: Sun Nov 10 10:39:10 2024 +0100 Handle InjectionPointsTransformer deprecations in OIDC extension commit 0782ecc Merge: 1e2140d e5a21e4 Author: Georgios Andrianakis <geoand@gmail.com> Date: Sat Nov 9 19:28:37 2024 +0200 Merge pull request quarkusio#44273 from Vinche59/kubernetest-nodeSelector-without-dekorate-bump Add nodeSelector capability to kubernetes extension commit e5a21e4 Author: Vincent Sourin <sourin-v@bridgestone-bae.com> Date: Sun Oct 27 13:31:27 2024 +0100 Add nodeSelect capability to kubernetes extension. Fix quarkusio#44122 Signed-off-by: Vinche <sourin-v@bridgestone-bae.com> commit 1e2140d Merge: 00f271c 48d8fb7 Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Sat Nov 9 16:53:01 2024 +0100 Merge pull request quarkusio#44394 from quarkusio/dependabot/maven/io.quarkus.bot-build-reporter-maven-extension-3.9.6 Bump io.quarkus.bot:build-reporter-maven-extension from 3.9.5 to 3.9.6 commit 00f271c Merge: ee2100b 9361944 Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Sat Nov 9 16:52:27 2024 +0100 Merge pull request quarkusio#44396 from quarkusio/dependabot/maven/org.apache.groovy-groovy-4.0.24 Bump org.apache.groovy:groovy from 4.0.23 to 4.0.24 commit ee2100b Merge: 3321050 f983e20 Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Sat Nov 9 12:17:00 2024 +0000 Merge pull request quarkusio#44389 from michalvavrik/feature/kc-dev-svc-for-kc-admin-client Start Keycloak Dev Services for standalone Keycloak Admin REST/RESTEasy clients commit 3321050 Merge: 76cba8c 3f10b51 Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Sat Nov 9 11:29:52 2024 +0000 Merge pull request quarkusio#44374 from sberyozkin/optimize_oidc_tenants_grouping Improve the way OIDC tenants are grouped and their properties are generated commit 76cba8c Merge: 4221467 af78f41 Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Sat Nov 9 11:28:55 2024 +0000 Merge pull request quarkusio#44397 from quarkusio/dependabot/maven/com.nimbusds-nimbus-jose-jwt-9.46 Bump com.nimbusds:nimbus-jose-jwt from 9.45 to 9.46 commit 4221467 Merge: 81d5343 bfb59fc Author: George Gastaldi <gegastaldi@gmail.com> Date: Fri Nov 8 21:27:01 2024 -0300 Merge pull request quarkusio#44398 from sberyozkin/keycloak_devservice_prop_doc_typo Fix Keycloak DevService property doc typo commit bfb59fc Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Fri Nov 8 23:18:02 2024 +0000 Fix Keycloak DevService property doc typo commit af78f41 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Nov 8 22:28:30 2024 +0000 Bump com.nimbusds:nimbus-jose-jwt from 9.45 to 9.46 Bumps [com.nimbusds:nimbus-jose-jwt](https://bitbucket.org/connect2id/nimbus-jose-jwt) from 9.45 to 9.46. - [Changelog](https://bitbucket.org/connect2id/nimbus-jose-jwt/src/master/CHANGELOG.txt) - [Commits](https://bitbucket.org/connect2id/nimbus-jose-jwt/branches/compare/9.46..9.45) --- updated-dependencies: - dependency-name: com.nimbusds:nimbus-jose-jwt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> commit 9361944 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Nov 8 22:27:26 2024 +0000 Bump org.apache.groovy:groovy from 4.0.23 to 4.0.24 Bumps [org.apache.groovy:groovy](https://github.com/apache/groovy) from 4.0.23 to 4.0.24. - [Commits](https://github.com/apache/groovy/commits) --- updated-dependencies: - dependency-name: org.apache.groovy:groovy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> commit 48d8fb7 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Nov 8 22:24:14 2024 +0000 Bump io.quarkus.bot:build-reporter-maven-extension from 3.9.5 to 3.9.6 Bumps [io.quarkus.bot:build-reporter-maven-extension](https://github.com/quarkusio/build-reporter) from 3.9.5 to 3.9.6. - [Commits](quarkusio/build-reporter@3.9.5...3.9.6) --- updated-dependencies: - dependency-name: io.quarkus.bot:build-reporter-maven-extension dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> commit 3f10b51 Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Thu Nov 7 19:12:09 2024 +0000 Improve the way OIDC tenants are grouped and their properties are generated commit 81d5343 Merge: 901675f a4d7e2f Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Fri Nov 8 22:26:14 2024 +0100 Merge pull request quarkusio#44390 from gsmet/better-deployment-detection Fix runtime/deployment detection and propagate it commit 901675f Merge: d1c3ae8 3d110d1 Author: Clement Escoffier <clement@apache.org> Date: Fri Nov 8 19:34:29 2024 +0100 Merge pull request quarkusio#43232 from troosan/quarkusio#23127 Add support for Socket Logging Handler with basic ECS format logging commit d1c3ae8 Merge: 7603085 1813c5a Author: Sergey Beryozkin <sberyozkin@gmail.com> Date: Fri Nov 8 17:33:42 2024 +0000 Merge pull request quarkusio#44388 from gsmet/fix-config-generation Fix some invalid configuration cases for doc generation and fail the build if some description are missing commit 7603085 Merge: 30d733f 77747da Author: Georgios Andrianakis <geoand@gmail.com> Date: Fri Nov 8 17:37:21 2024 +0200 Merge pull request quarkusio#44373 from geoand/quarkusio#44231 Ensure that custom Jackson modules work in dev-mode commit a4d7e2f Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Fri Nov 8 15:46:23 2024 +0100 Fix runtime/deployment detection and propagate it That way, we can assert if the module is a deployment module later in the process. Related to quarkusio#43513 commit f983e20 Author: Michal Vavřík <mvavrik@redhat.com> Date: Fri Nov 8 16:06:21 2024 +0100 Start Keycloak Dev Svc for standalone KC Admin client commit 1813c5a Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Fri Nov 8 14:47:20 2024 +0100 Generate a report for missing Javadoc and fail the build if not empty commit bab4a5a Author: Guillaume Smet <guillaume.smet@gmail.com> Date: Fri Nov 8 14:46:20 2024 +0100 Fix some invalid configuration cases TransactionManagerConfiguration was just plain weird so fixed it. For the others, we need to mark the interfaces as being config or we won't generate the Javadoc for them. commit 30d733f Merge: 5be2257 959a2e1 Author: Martin Kouba <mkouba@redhat.com> Date: Fri Nov 8 11:28:14 2024 +0100 Merge pull request quarkusio#44385 from mkouba/issue-44366 Qute: fix generation of qute-i18n-examples commit 77747da Author: Georgios Andrianakis <geoand@gmail.com> Date: Thu Nov 7 20:22:31 2024 +0200 Ensure that custom Jackson modules work in dev-mode Fixes: quarkusio#44231 commit 959a2e1 Author: Martin Kouba <mkouba@redhat.com> Date: Fri Nov 8 08:43:36 2024 +0100 Qute: fix generation of qute-i18n-examples - handle localized enums correctly - fixes quarkusio#44366 commit 611f5e0 Author: Robin De Mol <de.mol.robin@gmail.com> Date: Thu Nov 7 22:04:13 2024 +0100 datasource devservices: showLogs Brings support for JBossLoggingConsumer to container-based datasource dev services, and adds a little section to the documentation about the new "showLogs" option. Also contains a minor correction to the AppCDS documentation. commit 5be2257 Merge: 9761a6e b0339bd Author: Georgios Andrianakis <geoand@gmail.com> Date: Fri Nov 8 08:25:50 2024 +0200 Merge pull request quarkusio#44377 from quarkusio/dependabot/maven/flyway.version-10.21.0 Bump flyway.version from 10.20.1 to 10.21.0 commit 9761a6e Merge: 5810fca dd2201e Author: Georgios Andrianakis <geoand@gmail.com> Date: Fri Nov 8 08:16:56 2024 +0200 Merge pull request quarkusio#44376 from dmlloyd/log-docs Clarify logging rotation docs a little bit commit 5a2d46c Author: Roberto Cortez <radcortez@yahoo.com> Date: Wed Nov 6 12:02:09 2024 +0000 Avoid possible concurrency issues with RestClientsConfig.RestClientKeysProvider.KEYS in build time commit 606143b Author: Jose <josecarvajalhilario@gmail.com> Date: Wed Nov 6 07:38:16 2024 +0100 REST Server/Client allows configuring the removal of trailing slashs Before these changes, the REST server and client extensions were removing the trailing slashes that were set by users in the `@Path` annotations. For example, when creating a resource like: ```java @path("/a/") @produces(MediaType.TEXT_PLAIN) public class HelloResource { @get public String echo() { // ... } } ``` The effective path was `/a` instead of `/a/`. Note that it does not matter whether we place the `@Path` annotation at method level because the behaviour will be the same. At the client side, when having the following client: ``` @RegisterRestClient(configKey = "test") @path("/a/") <1> public interface HelloClient { @get @produces(MediaType.TEXT_PLAIN) @path("/b/") <2> String echo(); } ``` In this case, the trailing slash will be removed from <1> but not from <2>. After these changes, we are adding the following properties: - `quarkus.rest.removes-trailing-slash` To configure the server extension to not remove any trailing slash from the `@Path` annotations. - `quarkus.rest-client.removes-trailing-slash` To configure the client extension to not remove any traling slash from the `@Path` annotations used at interface level. The annotations set at method level will behave the same. Note that this does not introduce any change in behaviour, so everything should keep working as before unless users use the new properties. commit ae36baf Author: Jose <josecarvajalhilario@gmail.com> Date: Wed Nov 6 07:36:36 2024 +0100 REST Client build time fix for DevServices commit b0339bd Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Nov 7 22:55:05 2024 +0000 Bump flyway.version from 10.20.1 to 10.21.0 Bumps `flyway.version` from 10.20.1 to 10.21.0. Updates `org.flywaydb:flyway-core` from 10.20.1 to 10.21.0 - [Release notes](https://github.com/flyway/flyway/releases) - [Commits](flyway/flyway@flyway-10.20.1...flyway-10.21.0) Updates `org.flywaydb:flyway-sqlserver` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-mysql` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-database-oracle` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-database-postgresql` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-database-db2` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-database-derby` from 10.20.1 to 10.21.0 Updates `org.flywaydb:flyway-database-mongodb` from 10.20.1 to 10.21.0 --- updated-dependencies: - dependency-name: org.flywaydb:flyway-core dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-sqlserver dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-mysql dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-database-oracle dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-database-postgresql dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-database-db2 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-database-derby dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.flywaydb:flyway-database-mongodb dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> commit dd2201e Author: David M. Lloyd <david.lloyd@redhat.com> Date: Thu Nov 7 15:32:47 2024 -0600 Clarify logging rotation docs a little bit Fixes quarkusio#44346 commit 2ffe012 Author: Martin Kouba <mkouba@redhat.com> Date: Thu Oct 31 13:56:39 2024 +0100 Quartz: introduce Nonconcurrent - the behavior is identical to a Job class annotated with DisallowConcurrentExecution - fixes quarkusio#44048 commit 3d110d1 Author: Antoine de Troostembergh <antoine.de.troostembergh@gmail.com> Date: Sun Nov 3 20:54:47 2024 +0100 add socket log appender and basic ECS json formatting
- the behavior is identical to a Job class annotated with DisallowConcurrentExecution - fixes quarkusio#44048
I've stumbled upon the project https://github.com/lukas-krecan/ShedLock which "acquires a lock which prevents execution of the same task from another node" and has some CDI integration (supposedly tested with Quarkus). |
thanks @mkouba yes we are aware of shed lock. there is one team using it in springboot. |
yet Bump quarkus.platform.version from 3.17.0 to 3.17.2 doc must be out of date |
Indeed, the docs are not up to date 😉 |
Description
Considering a clustered setup of Quartz, the need for a recurrent task to be triggered only once its previous execution is terminated can be addressed using the programmatic way i.e. the Quartz API.
The declarative way i.e. the
@Scheduled
annotation is still limited, because itsconcurrentExecution
attribute manages non-concurrency locally on a single node i.e. a single application instance, but not globally, considering every nodes i.e. every application instances.Therefore, the request is to provide an equivalent solution design using the declarative way i.e. an annotation like the @scheduled one.
Implementation ideas
@DisallowedConcurrentExecution
annotation and theconcurrentExecution=SKIP
attribute of the @scheduled annotation.The text was updated successfully, but these errors were encountered: