Skip to content

Commit

Permalink
Scheduler - do not use interceptor to activate request context per exec
Browse files Browse the repository at this point in the history
- otherwise the scheduled bean must be proxyable
  • Loading branch information
mkouba committed Nov 18, 2019
1 parent 54dfc3b commit 92f71a4
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
import io.quarkus.gizmo.ResultHandle;
import io.quarkus.scheduler.Scheduled;
import io.quarkus.scheduler.ScheduledExecution;
import io.quarkus.scheduler.runtime.ScheduledInvoker;
import io.quarkus.scheduler.runtime.AbstractScheduledInvoker;
import io.quarkus.scheduler.runtime.ScheduledMethodMetadata;
import io.quarkus.scheduler.runtime.SchedulerConfig;
import io.quarkus.scheduler.runtime.SchedulerRecorder;
Expand Down Expand Up @@ -98,27 +98,19 @@ AnnotationsTransformerBuildItem annotationTransformer() {

@Override
public boolean appliesTo(org.jboss.jandex.AnnotationTarget.Kind kind) {
return kind == org.jboss.jandex.AnnotationTarget.Kind.CLASS
|| kind == org.jboss.jandex.AnnotationTarget.Kind.METHOD;
return kind == org.jboss.jandex.AnnotationTarget.Kind.CLASS;
}

@Override
public void transform(TransformationContext context) {
if (context.isClass() && context.getAnnotations().isEmpty()) {
// Class with no annotations but with @Scheduled method
if (context.isClass() && !BuiltinScope.isDeclaredOn(context.getTarget().asClass())) {
// Class with no built-in scope annotation but with @Scheduled method
if (context.getTarget().asClass().annotations().containsKey(SCHEDULED_NAME)
|| context.getTarget().asClass().annotations().containsKey(SCHEDULES_NAME)) {
LOGGER.debugf("Found scheduled business methods on a class %s with no annotations - adding @Singleton",
context.getTarget());
context.transform().add(Singleton.class).done();
}
} else if (context.isMethod()) {
MethodInfo method = context.getTarget().asMethod();
if ((method.hasAnnotation(SCHEDULED_NAME) || method.hasAnnotation(SCHEDULES_NAME))
&& !method.hasAnnotation(DotNames.ACTIVATE_REQUEST_CONTEXT)) {
// Activate request context during a scheduled method invocation
context.transform().add(DotNames.ACTIVATE_REQUEST_CONTEXT).done();
}
}
}
});
Expand Down Expand Up @@ -263,10 +255,10 @@ private String generateInvoker(BeanInfo bean, MethodInfo method, ClassOutput cla
+ HashUtil.sha1(sigBuilder.toString());

ClassCreator invokerCreator = ClassCreator.builder().classOutput(classOutput).className(generatedName)
.interfaces(ScheduledInvoker.class)
.superClass(AbstractScheduledInvoker.class)
.build();

MethodCreator invoke = invokerCreator.getMethodCreator("invoke", void.class, ScheduledExecution.class);
MethodCreator invoke = invokerCreator.getMethodCreator("invokeBean", void.class, ScheduledExecution.class);
// InjectableBean<Foo: bean = Arc.container().bean("1");
// InstanceHandle<Foo> handle = Arc.container().instance(bean);
// handle.get().ping();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.quarkus.scheduler.runtime;

import io.quarkus.arc.Arc;
import io.quarkus.arc.ManagedContext;
import io.quarkus.scheduler.ScheduledExecution;

public abstract class AbstractScheduledInvoker implements ScheduledInvoker {

@Override
public void invoke(ScheduledExecution execution) {
ManagedContext requestContext = Arc.container().requestContext();
if (requestContext.isActive()) {
invokeBean(execution);
} else {
try {
requestContext.activate();
invokeBean(execution);
} finally {
requestContext.terminate();
}
}
}

public abstract void invokeBean(ScheduledExecution action);

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
*/
public interface ScheduledInvoker {

void invoke(ScheduledExecution action);
void invoke(ScheduledExecution execution);

}

0 comments on commit 92f71a4

Please sign in to comment.