Skip to content
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

Closed
vondacho opened this issue Oct 23, 2024 · 29 comments · Fixed by #44224
Closed

To add support for non-concurrent task execution in a clustered environment #44048

vondacho opened this issue Oct 23, 2024 · 29 comments · Fixed by #44224
Labels
Milestone

Comments

@vondacho
Copy link

vondacho commented Oct 23, 2024

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.

final JobDetail job = JobBuilder.newJob(MyTask.class).withIdentity(identity, group).build();
final Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity(identity, group)
        .withSchedule(CronScheduleBuilder.cronSchedule(cron))
        .build();
scheduler.schedule(job, trigger);

@DisallowConcurrentExecution
public static final class MyTask implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        // my work
    }
}

The declarative way i.e. the @Scheduled annotation is still limited, because its concurrentExecution 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

  • To bridge the @DisallowedConcurrentExecution annotation and the concurrentExecution=SKIP attribute of the @scheduled annotation.
  • To design another annotation
@vondacho vondacho added the kind/enhancement New feature or request label Oct 23, 2024
@geoand
Copy link
Contributor

geoand commented Oct 23, 2024

cc @mkouba

@vsevel
Copy link
Contributor

vsevel commented Oct 24, 2024

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.
this current limitation requires us to stay on the programmatic approach, which ideally we would like to avoid in simple cases.
the other option is for us to switch on jobrunr. but for legacy eap applications that are migrating to quarkus and are already working with quartz, this would make our life simpler if we could stay with quartz.

@mkouba
Copy link
Contributor

mkouba commented Oct 24, 2024

I do understand your needs. In theory, we could map @Scheduled#concurrentExecution=SKIP to a org.quartz.Job implementation class annotated with @DisallowedConcurrentExecution but we'll need to check if this annotation itself is enough. Also it would be a breaking change because AFAIK the FQCN of the job is used in Quartz tables.

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 SkipPredicate API, it leverages SuccessfulExecution/FailedExecution events and Hibernate + Panache + JTA + PostgreSQL: https://github.com/mkouba/scheduler-mutex/blob/main/src/main/java/org/acme/Jobs.java

@mkouba
Copy link
Contributor

mkouba commented Oct 25, 2024

I think that we'll need to introduce a new annotation because @Scheduled#concurrentExecution=SKIP does not really map to @DisallowedConcurrentExecution. First of all, we won't be able to fire the SkippedExecution event. Furthermore, Quartz defines various misfire policies whereas ConcurrentExecution#SKIP has single policy - skip execution. I will try to propose a pull request with @io.quarkus.quartz.Nonconcurrent.

@mkouba
Copy link
Contributor

mkouba commented Oct 31, 2024

So I have a working solution but it has quite some limitations.

TLDR>

It only works if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true (it's false by default) and only for scheduled methods with blocking signature (it won't work for non-blocking scheduled methods and for methods annotated with @RunOnVirtualThread).

Why it won't work with quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false?

Because we do not execute the scheduled method on a Quartz thread by default. We only trigger the execution from a Quartz thread and return immediately. We offload the execution to the corresponding executor (event loop, worker thread, virtual thread executor). The main reason is consistency and propagation of the Vert.x duplicated context.

What can we do?

We could detect quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false and fail during startup if @Nonconcurrent is used. We could also detect @Nonconcurrent declared on a non-blocking/virtual thread scheduled method.

Is it really worth the effort?

I'm not really sure...

CC @manovotn

Here's my draft PR: #44224

@manovotn
Copy link
Contributor

manovotn commented Nov 4, 2024

Is it really worth the effort?

I'm not really sure...

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 quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread property.

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).

@mkouba
Copy link
Contributor

mkouba commented Nov 4, 2024

And last but not least, #44048 (comment) 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.

@vsevel
Copy link
Contributor

vsevel commented Nov 5, 2024

It only works if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true

that would not be an issue. we have our own extensions where we can force the apps to set this property.

only for scheduled methods with blocking signature (it won't work for non-blocking scheduled methods and for methods annotated with @RunOnVirtualThread)

it would not be an issue, since the workaround does not do any better. we run anyway on the quartz thread, and @RunOnVirtualThread typically does not do anything.
there are no thousands of timers typically in an application, so we can spare some blocking threads for this activity.

The main reason is consistency and propagation of the Vert.x duplicated context.

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?
what are other consistency issues?

We could also detect @Nonconcurrent declared on a non-blocking/virtual thread scheduled method.

virtual thread is already covered at startup (the app fails to start with a clear message)
this is a nice to have. with that solution we would plan to force the use of the property from our extensions.

... 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

our original need was to be able to run exclusive timers on quartz, and anything else on the simple scheduler.
we do not need the extra flexibility offered by the workaround.
furthermore, we actually don't feel we have a better solution with the workaround as:

  • we execute on a blocking thread, which is a quartz thread just like in the PR
  • the declaration is more cumbersome as we have to create a new job class, and schedule it programmatically at app startup

Ultimately, @vsevel and @vondacho should have the last word on that as you are running this use case.

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.
if you think this is not really worth the effort, we would gladly stay with the workaround. that would not be an issue.

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.

@mkouba
Copy link
Contributor

mkouba commented Nov 5, 2024

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 quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false and @Nonconcurrent is used. And we'll see what CI thinks...

mkouba added a commit to mkouba/quarkus that referenced this issue Nov 5, 2024
@vsevel
Copy link
Contributor

vsevel commented Nov 6, 2024

We only trigger the execution from a Quartz thread and return immediately

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?
that way you would get the duplicated context and consistency.

@mkouba
Copy link
Contributor

mkouba commented Nov 6, 2024

We only trigger the execution from a Quartz thread and return immediately

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? that way you would get the duplicated context and consistency.

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 @Nonconcurrent methods it might be confusing for users. We could make it configurable but that's IMO even more confusing.

@vsevel
Copy link
Contributor

vsevel commented Nov 6, 2024

If we only do it for @Nonconcurrent methods it might be confusing for users

that is what I was thinking, and may be only when the blocking property is set.
that way you would have consistency for the user application from a threading point of view (always running on a worker thread from quarkus).
you solve the duplicated context and other potential consistency issues.
the fact that it is triggered from quartz thread is an implementation detail, technically required for Nonconcurrent

@mkouba
Copy link
Contributor

mkouba commented Nov 6, 2024

If we only do it for @Nonconcurrent methods it might be confusing for users

that is what I was thinking, and may be only when the blocking property is set.

Which property do you have in mind?

that way you would have consistency for the user application from a threading point of view (always running on a worker thread from quarkus). you solve the duplicated context and other potential consistency issues. the fact that it is triggered from quartz thread is an implementation detail, technically required for Nonconcurrent

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 @Nonconcurrent.

WDYT? @manovotn

@vsevel
Copy link
Contributor

vsevel commented Nov 6, 2024

Which property do you have in mind?

quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true

@manovotn
Copy link
Contributor

manovotn commented Nov 6, 2024

Which property do you have in mind?

quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true

Just to make sure I understand this, you're suggesting that with this property set, we handle blocking scheduled jobs so that:

  • We trigger them from a Quartz thread
  • However, we still offload them to a thread from Quarkus thread pool
  • We block the Quartz thread until the execution of the job completes within Quarkus thread

Is that right?

If so, I think this could work if we only do that for @Nonconcurrent jobs where the price of locking two threads for a single execution is "justifiable". Although I am not sure how to clearly communicate this to users. Especially given that in such a case they should also tweak the Quartz pool config or at least be aware of how big it is by default.

@mkouba
Copy link
Contributor

mkouba commented Nov 6, 2024

Which property do you have in mind?

quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true

Just to make sure I understand this, you're suggesting that with this property set, we handle blocking scheduled jobs so that:

* We trigger them from a Quartz thread

* However, we still offload them to a thread from Quarkus thread pool

* We block the Quartz thread until the execution of the job completes within Quarkus thread

Is that right?

If so, I think this could work if we only do that for @Nonconcurrent jobs where the price of locking two threads for a single execution is "justifiable". Although I am not sure how to clearly communicate this to users. Especially given that in such a case they should also tweak the Quartz pool config or at least be aware of how big it is by default.

I don't think it makes a lot of sense. If quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=true then we should always execute the method on a quartz thread, otherwise we add another exception and modify the existing behavior 👎.

In theory, we could block the quartz thread if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false. This way, @Nonconcurrent would work without a config change. And it could be documented in the javadoc of @Nonconcurrent...

@manovotn
Copy link
Contributor

manovotn commented Nov 6, 2024

In theory, we could block the quartz thread if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false. This way, @Nonconcurrent would work without a config change. And it could be documented in the javadoc of @Nonconcurrent...

Yes, that's essentially the same - they key point is that we want to only have this behavior for @Nonconcurrent and the less special config knobs we need to have for that, the better :)

@mkouba
Copy link
Contributor

mkouba commented Nov 6, 2024

In theory, we could block the quartz thread if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false. This way, @Nonconcurrent would work without a config change. And it could be documented in the javadoc of @Nonconcurrent...

Yes, that's essentially the same - they key point is that we want to only have this behavior for @Nonconcurrent and the less special config knobs we need to have for that, the better :)

Hm, it's not the same but I get your point. I will adapt my PR then.

@mkouba
Copy link
Contributor

mkouba commented Nov 6, 2024

In theory, we could block the quartz thread if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false. This way, @Nonconcurrent would work without a config change. And it could be documented in the javadoc of @Nonconcurrent...

Yes, that's essentially the same - they key point is that we want to only have this behavior for @Nonconcurrent and the less special config knobs we need to have for that, the better :)

Hm, it's not the same but I get your point. I will adapt my PR then.

Done.

@vsevel
Copy link
Contributor

vsevel commented Nov 6, 2024

the price of locking two threads for a single execution

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

@mkouba
Copy link
Contributor

mkouba commented Nov 7, 2024

what did you end up doing? @mkouba

We only block the quartz thread if quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread=false and @Nonconcurrent is used so that no config change is needed.

@vsevel
Copy link
Contributor

vsevel commented Nov 7, 2024

ok. and you execute the business method on that quartz thread, or you offload it to a quarkus thread?

@mkouba
Copy link
Contributor

mkouba commented Nov 7, 2024

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.

@vsevel
Copy link
Contributor

vsevel commented Nov 8, 2024

that may have been a good thing to introduce a complete new annotation QuartzSchedule, and keep Scheduler for the normal simple timer.
that way there was no need to add executeWith=QUARTZ, and the non concurrent could have been an attribute on QuartzSchedule

@mkouba
Copy link
Contributor

mkouba commented Nov 11, 2024

that may have been a good thing to introduce a complete new annotation QuartzSchedule, and keep Scheduler for the normal simple timer. that way there was no need to add executeWith=QUARTZ, and the non concurrent could have been an attribute on QuartzSchedule

I don't think it would be a good idea. @Nonconcurrent and executeWith=QUARTZ are corner cases. We want to try to keep the API unified where possible so that it's easy to switch the underlying implementation in most use cases.

@mkouba mkouba closed this as completed in 2ffe012 Nov 11, 2024
@quarkus-bot quarkus-bot bot added this to the 3.17 - main milestone Nov 11, 2024
DeMol-EE added a commit to DeMol-EE/quarkus that referenced this issue Nov 12, 2024
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
bschuhmann pushed a commit to bschuhmann/quarkus that referenced this issue Nov 16, 2024
- the behavior is identical to a Job class annotated with DisallowConcurrentExecution
- fixes quarkusio#44048
@mkouba
Copy link
Contributor

mkouba commented Dec 2, 2024

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 SkipPredicate API, it leverages SuccessfulExecution/FailedExecution events and Hibernate + Panache + JTA + PostgreSQL: https://github.com/mkouba/scheduler-mutex/blob/main/src/main/java/org/acme/Jobs.java

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).

@vsevel
Copy link
Contributor

vsevel commented Dec 3, 2024

thanks @mkouba yes we are aware of shed lock. there is one team using it in springboot.
we are still interested in quartz for legacy apps that we migrate to quarkus. they have the quartz tables created and initialized, plus we can parallel run with the old EAP processes if we need to. but for greenfields apps, we recommend looking into jobrunr. shedlock is definitely an other option.
thanks for the pointer.

@vsevel
Copy link
Contributor

vsevel commented Dec 3, 2024

The implementation only depends on jakarta.enterprise.cdi-api and microprofile-config-api so it should be usable in other CDI compatible frameworks, but it has not been tested with anything else than Quarkus. It's built on top of javax annotation as Quarkus has not moved to Jakarta EE namespace yet.

yet Bump quarkus.platform.version from 3.17.0 to 3.17.2

doc must be out of date

@mkouba
Copy link
Contributor

mkouba commented Dec 3, 2024

The implementation only depends on jakarta.enterprise.cdi-api and microprofile-config-api so it should be usable in other CDI compatible frameworks, but it has not been tested with anything else than Quarkus. It's built on top of javax annotation as Quarkus has not moved to Jakarta EE namespace yet.

hmmm ;-)
they need to refresh a bit

Indeed, the docs are not up to date 😉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants