Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2017-2020 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.scheduling.processor;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.BeanContext;
import io.micronaut.context.processor.ExecutableMethodProcessor;
import io.micronaut.core.annotation.AnnotationValue;
import io.micronaut.core.convert.ConversionService;
import io.micronaut.core.type.Argument;
import io.micronaut.core.util.StringUtils;
import io.micronaut.inject.BeanDefinition;
import io.micronaut.inject.ExecutableMethod;
import io.micronaut.inject.qualifiers.Qualifiers;
import io.micronaut.scheduling.ScheduledExecutorTaskScheduler;
import io.micronaut.scheduling.TaskExceptionHandler;
import io.micronaut.scheduling.TaskExecutors;
import io.micronaut.scheduling.TaskScheduler;
import io.micronaut.scheduling.annotation.Scheduled;
import io.micronaut.scheduling.exceptions.SchedulerConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Qualifier;
import javax.inject.Singleton;
import java.io.Closeable;
import java.time.Duration;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
/**
* A {@link ExecutableMethodProcessor} for the {@link Scheduled} annotation.
*
* @author graemerocher
* @since 1.0
*/
@Singleton
public class ScheduledMethodProcessor implements ExecutableMethodProcessor, Closeable {
private static final Logger LOG = LoggerFactory.getLogger(TaskScheduler.class);
private static final String MEMBER_FIXED_RATE = "fixedRate";
private static final String MEMBER_INITIAL_DELAY = "initialDelay";
private static final String MEMBER_CRON = "cron";
private static final String MEMBER_FIXED_DELAY = "fixedDelay";
private static final String MEMBER_SCHEDULER = "scheduler";
private final BeanContext beanContext;
private final ConversionService> conversionService;
private final Queue> scheduledTasks = new ConcurrentLinkedDeque<>();
private final TaskExceptionHandler, ?> taskExceptionHandler;
/**
* @param beanContext The bean context for DI of beans annotated with {@link javax.inject.Inject}
* @param conversionService To convert one type to another
* @param taskExceptionHandler The default task exception handler
*/
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
public ScheduledMethodProcessor(BeanContext beanContext, Optional> conversionService, TaskExceptionHandler, ?> taskExceptionHandler) {
this.beanContext = beanContext;
this.conversionService = conversionService.orElse(ConversionService.SHARED);
this.taskExceptionHandler = taskExceptionHandler;
}
@SuppressWarnings("unchecked")
@Override
public void process(BeanDefinition> beanDefinition, ExecutableMethod, ?> method) {
if (!(beanContext instanceof ApplicationContext)) {
return;
}
List> scheduledAnnotations = method.getAnnotationValuesByType(Scheduled.class);
for (AnnotationValue scheduledAnnotation : scheduledAnnotations) {
String fixedRate = scheduledAnnotation.get(MEMBER_FIXED_RATE, String.class).orElse(null);
String initialDelayStr = scheduledAnnotation.get(MEMBER_INITIAL_DELAY, String.class).orElse(null);
Duration initialDelay = null;
if (StringUtils.hasText(initialDelayStr)) {
initialDelay = conversionService.convert(initialDelayStr, Duration.class).orElseThrow(() ->
new SchedulerConfigurationException(method, "Invalid initial delay definition: " + initialDelayStr)
);
}
String scheduler = scheduledAnnotation.get(MEMBER_SCHEDULER, String.class).orElse(TaskExecutors.SCHEDULED);
Optional optionalTaskScheduler = beanContext
.findBean(TaskScheduler.class, Qualifiers.byName(scheduler));
if (!optionalTaskScheduler.isPresent()) {
optionalTaskScheduler = beanContext.findBean(ExecutorService.class, Qualifiers.byName(scheduler))
.filter(ScheduledExecutorService.class::isInstance)
.map(ScheduledExecutorTaskScheduler::new);
}
TaskScheduler taskScheduler = optionalTaskScheduler.orElseThrow(() -> new SchedulerConfigurationException(method, "No scheduler of type TaskScheduler configured for name: " + scheduler));
Runnable task = () -> {
io.micronaut.context.Qualifier